Delphi 将文本从UTF-8转换为Windows 1251
我尝试将utf8中的文本转换为windows1251 这是原文 这是targerСаааааа-ПаабббаббабаГ 我测试了很多函数:Utf8ToAnsi、UTF8ToString、Utf8Encode和其他函数,但没有得到真正的结果Delphi 将文本从UTF-8转换为Windows 1251,delphi,delphi-xe8,Delphi,Delphi Xe8,我尝试将utf8中的文本转换为windows1251 这是原文 这是targerСаааааа-ПаабббаббабаГ 我测试了很多函数:Utf8ToAnsi、UTF8ToString、Utf8Encode和其他函数,但没有得到真正的结果 需要帮助。让我们试着猜猜你在问什么。请看前五个字符: Ñàíêò 如果我们假设它们实际上是十六进制的,那么它们的编码如下: D1 E0 ED EA F2 现在,这五个字节被解释为: 因此,这里似乎没有涉及UTF-8。您只是将文本误解为来自代码页1252
需要帮助。让我们试着猜猜你在问什么。请看前五个字符:
Ñàíêò
如果我们假设它们实际上是十六进制的,那么它们的编码如下:
D1 E0 ED EA F2
现在,这五个字节被解释为:
因此,这里似乎没有涉及UTF-8。您只是将文本误解为来自代码页1252,而实际上它来自1251
我测试了很多函数:Utf8ToAnsi、UTF8ToString、Utf8Encode和其他函数,但没有得到真正的结果 更一般地说,当您发现自己随机调用函数时,通常意味着您还没有完全理解这个问题。这是一个有用的技能,能够认识到这种感觉,并知道是时候退一步,并试图获得更深的理解
任何人解释如何从UTF-8转换到1251都没有多大意义,因为这不是您需要做的。我不会尝试向您展示任何代码来解决您的问题,因为我不知道:
很可能您已将这些字节读入带有代码页1252的
AnsiString
。但在这一点上,我判断这种猜测太过分了。如果您对您的问题进行了一些澄清,那么我们可能会添加更多的细节。让我们试着猜一猜您在问什么。请看前五个字符:
Ñàíêò
如果我们假设它们实际上是十六进制的,那么它们的编码如下:
D1 E0 ED EA F2
现在,这五个字节被解释为:
因此,这里似乎没有涉及UTF-8。您只是将文本误解为来自代码页1252,而实际上它来自1251
我测试了很多函数:Utf8ToAnsi、UTF8ToString、Utf8Encode和其他函数,但没有得到真正的结果 更一般地说,当您发现自己随机调用函数时,通常意味着您还没有完全理解这个问题。这是一个有用的技能,能够认识到这种感觉,并知道是时候退一步,并试图获得更深的理解
任何人解释如何从UTF-8转换到1251都没有多大意义,因为这不是您需要做的。我不会尝试向您展示任何代码来解决您的问题,因为我不知道:
AnsiString
。但在这一点上,我判断这种猜测太过分了。如果您对您的问题进行澄清,那么我们可能会添加更多细节
我尝试将utf8中的文本转换为windows1251
由于您使用的是Delphi 2009+,最简单的解决方案是使用UT8String
和AnsiString(N)
类型,并让RTL为您处理转换(除非您是为移动平台编译的,在这种情况下,UTF8String
和AnsiString(N)
在未安装的情况下不可用):
或者,您可以使用RTL的UnicodeFromLocaleChars()
和LocaleCharsFromUnicode()
函数:
var
Utf8: UTF8String;
Utf16: UnicodeString;
Win1251: RawByteString;
begin
// populate UTF-8 as needed...
Utf8 := ...;
// convert from UTF-8 to UTF-16...
SetLength(Utf16, UnicodeFromLocaleChars(65001, 0, PAnsiChar(UTf8), Length(Utf8), nil, 0));
UnicodeFromLocaleChars(65001, 0, PAnsiChar(Utf8), Length(Utf8), PWideChar(Utf16), Length(Utf16));
// convert from UTF-16 to Windows-1251...
SetLength(Win1251, LocaleCharsFromUnicode(1251, 0, PWideChar(Utf16), Length(Utf16), nil, 0, nil, nil));
LocaleCharsFromUnicode(1251, 0, PWideChar(Utf16), Length(Utf16), PAnsiChar(Win1251), Length(Win1251), nil, nil);
SetCodePage(Win1251, 1251);
// use Win1251 as needed...
end;
或者您可以直接使用Win32MultiByteToWideChar()
和WideCharToMultiByte()
函数(或第三方Unicode库,如iconv或ICU):
这是源文本,这是目标Сааааааааааа-Пааааааааа
不是的UTF-8编码形式,正确的UTF-8编码形式应该是的
。所以,正如其他人所指出的,您的数据实际上并不是以UTF-8编码的
我测试了很多函数:Utf8ToAnsi、UTF8ToString、Utf8Encode和其他函数,但没有得到真正的结果
Utf8ToAnsi()
不允许指定目标字符集。在Delphi 2009+中,它将UTF-8字符串解码为UTF-16UnicodeString
。在2009年以前的版本中,它会解码为一个AnsiString
,使用操作系统默认的Ansi代码页进行编码,不管发生什么情况
UTF8ToString()
将UTF-8字符串解码为UTF-16UnicodeString
Utf8Encode()
将UTF-16宽字符串编码为UTF-8
我尝试将utf8中的文本转换为windows1251
由于您使用的是Delphi 2009+,最简单的解决方案是使用UT8String
和AnsiString(N)
类型,并让RTL为您处理转换(除非您是为移动平台编译的,在这种情况下,UTF8String
和AnsiString(N)
在未安装的情况下不可用):
或者,您可以使用RTL的UnicodeFromLocaleChars()
和LocaleCharsFromUnicode()
函数:
var
Utf8: UTF8String;
Utf16: UnicodeString;
Win1251: RawByteString;
begin
// populate UTF-8 as needed...
Utf8 := ...;
// convert from UTF-8 to UTF-16...
SetLength(Utf16, UnicodeFromLocaleChars(65001, 0, PAnsiChar(UTf8), Length(Utf8), nil, 0));
UnicodeFromLocaleChars(65001, 0, PAnsiChar(Utf8), Length(Utf8), PWideChar(Utf16), Length(Utf16));
// convert from UTF-16 to Windows-1251...
SetLength(Win1251, LocaleCharsFromUnicode(1251, 0, PWideChar(Utf16), Length(Utf16), nil, 0, nil, nil));
LocaleCharsFromUnicode(1251, 0, PWideChar(Utf16), Length(Utf16), PAnsiChar(Win1251), Length(Win1251), nil, nil);
SetCodePage(Win1251, 1251);
// use Win1251 as needed...
end;
或者您可以直接使用Win32MultiByteToWideChar()
和WideCharToMultiByte()
函数(或第三方Unicode库,如iconv或ICU):
这是源文本,这是目标Сааааааааааа-Пааааааааа
不是的UTF-8编码形式,正确的UTF-8编码形式应该是的
。所以,正如其他人所指出的,您的数据实际上并不是用UTF-8到b编码的