1

MultiByteToWideChar を使用して UTF-8 文字列を UTF-16 に変換する C++ コード スニペットがあります。

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

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 に答える