Delphi 将文本从UTF-8转换为Windows 1251

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

我尝试将utf8中的文本转换为windows1251

这是原文 这是targerСаааааа-ПаабббаббабаГ

我测试了很多函数:Utf8ToAnsi、UTF8ToString、Utf8Encode和其他函数,但没有得到真正的结果


需要帮助。

让我们试着猜猜你在问什么。请看前五个字符:

Ñàíêò
如果我们假设它们实际上是十六进制的,那么它们的编码如下:

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都没有多大意义,因为这不是您需要做的。我不会尝试向您展示任何代码来解决您的问题,因为我不知道:

  • 数据来自何处,或
  • 您需要将数据转换成什么形式
  • 很可能您已将这些字节读入带有代码页1252的
    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;
    
    或者您可以直接使用Win32
    MultiByteToWideChar()
    WideCharToMultiByte()
    函数(或第三方Unicode库,如iconv或ICU):

    这是源文本,这是目标Сааааааааааа-Пааааааааа

    不是
    的UTF-8编码形式,正确的UTF-8编码形式应该是
    。所以,正如其他人所指出的,您的数据实际上并不是以UTF-8编码的

    我测试了很多函数:Utf8ToAnsi、UTF8ToString、Utf8Encode和其他函数,但没有得到真正的结果

    Utf8ToAnsi()
    不允许指定目标字符集。在Delphi 2009+中,它将UTF-8字符串解码为UTF-16
    UnicodeString
    。在2009年以前的版本中,它会解码为一个
    AnsiString
    ,使用操作系统默认的Ansi代码页进行编码,不管发生什么情况

    UTF8ToString()
    将UTF-8字符串解码为UTF-16
    UnicodeString

    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;
    
    或者您可以直接使用Win32
    MultiByteToWideChar()
    WideCharToMultiByte()
    函数(或第三方Unicode库,如iconv或ICU):

    这是源文本,这是目标Сааааааааааа-Пааааааааа

    不是
    的UTF-8编码形式,正确的UTF-8编码形式应该是
    。所以,正如其他人所指出的,您的数据实际上并不是用UTF-8到b编码的