【问题标题】:C# Encoding.Convert Vs C++ MultiByteToWideCharC# Encoding.Convert 与 C++ MultiByteToWideChar
【发布时间】:2012-10-18 04:11:37
【问题描述】:

我有一个 C++ 代码 sn-p,它使用 MultiByteToWideChar 将 UTF-8 字符串转换为 UTF-16

对于 C++,如果输入为“Hôtel”,则输出为“Hôtel”,这是正确的

对于 C#,如果输入是“Hôtel”,则输出是“Hôtel”,这是不正确的。

从 UTF8 转换为 UTF16 的 C# 代码如下所示

Encoding.Unicode.GetString(
            Encoding.Convert(
                Encoding.UTF8,
                Encoding.Unicode,
                Encoding.UTF8.GetBytes(utf8)));

在 C++ 中,转换代码如下所示

MultiByteToWideChar(
    CP_UTF8,            // convert from UTF-8
    0,                  // default flags
    utf8.data(),        // source UTF-8 string
    utf8.length(),      // length (in chars) of source UTF-8 string
    &utf16[0],          // destination buffer
    utf16.length()      // size of destination buffer, in wchar_t's
    )

我希望在 C# 中获得与在 C++ 中相同的结果。 C#代码有什么问题吗?

【问题讨论】:

    标签: c# character-encoding utf-16


    【解决方案1】:

    您似乎希望将字符串字符视为 Windows-1252(通常被错误标记为 ANSI)代码点,并将这些代码点解码为 UTF-8 字节,其中Windows-1252 code point == UTF-8 byte value

    接受的答案不起作用的原因是它将字符串字符视为 unicode 代码点,而不是 Windows-1252。它可以处理大多数字符,因为 Windows-1252 将它们映射为与 unicode 完全相同,但使用字符输入 像 等会失败,因为 Windows-1252 在这个意义上映射了与 unicode 不同的映射。

    所以你想要的就是这样:

    public static string doWeirdMapping(string arg)
    {
        Encoding w1252 = Encoding.GetEncoding(1252);
        return Encoding.UTF8.GetString(w1252.GetBytes(arg));
    }
    

    然后:

    Console.WriteLine(doWeirdMapping("Hôtel")); //prints Hôtel
    Console.WriteLine(doWeirdMapping("HVOLSVÖLLUR")); //prints HVOLSVÖLLUR
    

    【讨论】:

      【解决方案2】:

      也许是这个:

      private static string Utf8ToUnicode(string input)
      {
        return   Encoding.UTF8.GetString(input.Select(item => (byte)item).ToArray()); 
      }
      

      【讨论】:

      • 不幸的是,它并不总是有效!不知道为什么。例如,对于 UTF8 字符串,“HVOLSVÖLLUR”应该转换为“HVOLSVÖLLUR”,就像它在 C++ 中所做的那样,而不是在 C# 中。我想我宁愿在 MultiByteToWideChar 上使用 pInvoke
      【解决方案3】:

      试试这个

       string str = "abc!";
      
                  Encoding unicode = Encoding.Unicode;
                  Encoding utf8 = Encoding.UTF8;
      
                  byte[] unicodeBytes = unicode.GetBytes(str);
      
                  byte[] utf8Bytes = Encoding.Convert( unicode,
                                                       utf8,
                                                       unicodeBytes );
      
                  Console.WriteLine( "UTF Bytes:" );
                  StringBuilder sb = new StringBuilder();
                  foreach( byte b in utf8Bytes ) {
                      sb.Append( b ).Append(" : ");
                  }
                  Console.WriteLine( sb.ToString() ); 
      

      This Link 将有助于您了解编码及其转换

      【讨论】:

      • 这与我在帖子中粘贴的 C# 代码相同,并给出了问题中提到的输出。
      【解决方案4】:

      使用System.Text.Encoding.UTF8.GetString().

      以字节数组的形式传入您的 UTF-8 编码文本。该函数返回一个以 UTF-16 编码的标准 .net 字符串。

      示例函数如下:

      private string ReadData(Stream binary_file) {
        System.Text.Encoding encoding = System.Text.Encoding.UTF8;
        // Read string from binary file with UTF8 encoding
        byte[] buffer = new byte[30];
        binary_file.Read(buffer, 0, 30);
        return encoding.GetString(buffer);
      }
      

      【讨论】:

      • 谢谢,但不适用于我提到的输入字符串
      猜你喜欢
      • 2015-11-17
      • 2013-08-22
      • 2011-10-05
      • 2016-05-12
      • 2012-05-03
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多