C#Encoding.Convert与C ++ MultiByteToWideChar

时间:2012-10-18 04:11:37

标签: c# character-encoding utf-16

我有一个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 个答案:

答案 0 :(得分:6)

您似乎希望将字符串字符视为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

答案 1 :(得分:3)

也许这一个:

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

答案 2 :(得分: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() ); 

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

答案 3 :(得分:1)

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

将UTF-8编码的文本作为字节数组传递。该函数返回一个标准的.net字符串,该字符串以UTF-16编码。

示例功能如下:

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