德尔福6可以将UTF-8葡萄牙语转换为WideString吗?

问题描述:

我正在使用德尔福6.德尔福6可以将UTF-8葡萄牙语转换为WideString吗?

我想解码一个葡萄牙UTF-8编码的字符串到WideString,但我发现它不正确解码。

原文为"ANÁLISE8"。使用UTF8Decode()后,结果为"ANALISE8""A"上方的符号消失。

下面是代码:

var 
    f : textfile; 
    s : UTF8String; 
    w, test : WideString;  
begin 
    while not eof(f) do 
    begin 
    readln(f,s); 
    w := UTF8Decode(s); 

我怎样才能解码葡萄牙UTF-8字符串WideString是否正确?

+0

使用MultiByteToWideChar –

+0

很可能你是文件不是用UTF-8编写的。以UTF-8编写的文件通常具有3字节[字节顺序标记序列](https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8),如果文件不是安全地假设它使用系统的默认Ansi代码页。在这种情况下,将数据存储在“UTF8String”中不会产生UTF-8 ... –

+0

您是如何确定您的代码无法正常工作的?我敢打赌,你将WideString转换为ANSI。 –

请注意,在Delphi 6中执行UTF8Decode()是不完整的。具体来说,它不支持编码的4字节序列,这些序列需要处理高于U+FFFF的Unicode码点。这意味着UTF8Decode()只能解码UCS-2范围内的Unicode代码点,而不是完整的Unicode代码库。因此,在Delphi 6中(以及直到Delphi 2007一直到Delphi 2009最终都修复了这个问题),基本上无法使用UTF8Decode()

尝试使用Win32 MultiByteToWideChar()函数来代替,例如:

uses 
    ..., Windows; 

function MyUTF8Decode(const s: UTF8String): WideString; 
var 
    Len: Integer; 
begin 
    Len := MultiByteToWideChar(CP_UTF8, 0, PAnsiChar(s), Length(s), nil, 0); 
    SetLength(Result, Len); 
    if Len > 0 then 
    MultiByteToWideChar(CP_UTF8, 0, PAnsiChar(s), Length(s), PWideChar(Result), Len)); 
end; 

var 
    f : textfile; 
    s : UTF8String; 
    w, test : WideString; 
begin 
    while not eof(f) do 
    begin 
    readln(f,s); 
    w := MyUTF8Decode(s); 

话虽这么说,你ANÁLISE8串落在UCS-2的范围内,所以我在Delphi 6测试UTF8Decode()并解码UTF-8编码形式ANÁLISE8就好。我会得出这样的结论之一:

  • UTF8String变量不包含UTF-8的ANÁLISE8编码形式开始(字节序列41 4E C3 81 4C 49 53 45 38),而是包含了ASCII字符串ANALISE8代替(字节序列41 4E 41 4C 49 53 45 38)因为ASCII是UTF-8的一个子集,所以它将按原样解码。仔细检查你的文件,并输出Readln()

  • WideString包含ANÁLISE8正确的预期,但你现在的样子输出/调试它(你没有显示)被其转换为ANSI,在转换过程中丢失Á

+0

@DavidHeffernan:我更新了我的答案 –

+0

@DavidHeffernan:我更新了我的答案 –

+0

嗨,非常感谢,我只是将UTF-8代码转换为HEX并查看(字节序列41 4E C3 81 4C 49 53 45 38),所以我认为该文件必须是UTF-8格式...感谢您的函数MyUTF8Decode,只是使用它而不是UTF8Decode和结果是一样的,葡萄牙字符变成英文 –