德尔福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
是否正确?
请注意,在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,在转换过程中丢失Á
。
@DavidHeffernan:我更新了我的答案 –
@DavidHeffernan:我更新了我的答案 –
嗨,非常感谢,我只是将UTF-8代码转换为HEX并查看(字节序列41 4E C3 81 4C 49 53 45 38),所以我认为该文件必须是UTF-8格式...感谢您的函数MyUTF8Decode,只是使用它而不是UTF8Decode和结果是一样的,葡萄牙字符变成英文 –
使用MultiByteToWideChar –
很可能你是文件不是用UTF-8编写的。以UTF-8编写的文件通常具有3字节[字节顺序标记序列](https://en.wikipedia.org/wiki/Byte_order_mark#UTF-8),如果文件不是安全地假设它使用系统的默认Ansi代码页。在这种情况下,将数据存储在“UTF8String”中不会产生UTF-8 ... –
您是如何确定您的代码无法正常工作的?我敢打赌,你将WideString转换为ANSI。 –