1

我有一个 C++ 代码片段,它使用 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#代码有什么问题吗?

4

4 回答 4

6
于 2012-12-10T23:40:14.383 回答
3

也许这个:

private static string Utf8ToUnicode(string input)
{
  return   Encoding.UTF8.GetString(input.Select(item => (byte)item).ToArray()); 
}
于 2012-10-18T07:19:22.050 回答
1

试试这个

 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() ); 

此链接将有助于您了解编码及其转换

于 2012-10-18T04:23:45.637 回答
1

采用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);
}
于 2012-10-18T05:01:23.107 回答