【问题标题】:Unicode-to-string conversion in C#C# 中的 Unicode 到字符串的转换
【发布时间】:2010-11-15 12:13:04
【问题描述】:

如何将 Unicode 值转换为其等效字符串?

例如,我有“రమెశ్”,我需要一个接受此 Unicode 值并返回字符串的函数。

我正在查看 System.Text.Encoding.Convert() 函数,但它不包含 Unicode 值;它需要两种编码和一个字节数组。

我基本上有一个字节数组,我需要将其保存在字符串字段中,然后稍后再返回并将字符串首先转换回字节数组。

所以我使用 ByteConverter.GetString(byteArray) 将字节数组保存为字符串,但无法将其恢复为字节数组。

【问题讨论】:

  • 你的“Unicode”是什么格式的?
  • 好吧,我正在使用 UnicodeEncoding.GetString(byteArray) 方法,它从 byteArray 中返回一个字符串。当我检查字符串时,它有很多看起来很奇怪的符号!
  • 首先,停止你正在做的任何事情,阅读Joel's article about Unicode。甚至不要进一步阅读此答案。 现在就去那里!不,不偷看,文章第一! ... OK完成?然后你应该能够自己发现你的错误和正确的答案。如果没有,那么问问自己——那么我的“字符串”(字节数组)是什么编码的?
  • "Unicode" 不是编码。 .NET 中的 UnicodeEncoding 应该真正被称为 UTF16Encoding - 微软的耻辱。 :P
  • 哈!谢谢 :) 做 Encoding.Default 工作。我浏览了这篇文章......不过,当我有更多时间时,我会完整阅读。干杯

标签: c# .net vb.net


【解决方案1】:

使用.ToString();:

this.Text = ((char)0x00D7).ToString();

【讨论】:

    【解决方案2】:

    尝试以下方法:

    byte[] bytes = ...;
    
    string convertedUtf8 = Encoding.UTF8.GetString(bytes);
    string convertedUtf16 = Encoding.Unicode.GetString(bytes); // For UTF-16
    

    另一种方法是使用`GetBytes():

    byte[] bytesUtf8 = Encoding.UTF8.GetBytes(convertedUtf8);
    byte[] bytesUtf16 = Encoding.Unicode.GetBytes(convertedUtf16);
    

    Encoding 类中,如果您需要,还有更多变体。

    【讨论】:

      【解决方案3】:

      要将字符串转换为 Unicode 字符串,请执行以下操作:非常简单...注意 BytesToString 函数,该函数避免使用任何内置的转换内容。也很快。

      private string BytesToString(byte[] Bytes)
      {
        MemoryStream MS = new MemoryStream(Bytes);
        StreamReader SR = new StreamReader(MS);
        string S = SR.ReadToEnd();
        SR.Close();
        return S;
      }
      
      private string ToUnicode(string S)
      {
        return BytesToString(new UnicodeEncoding().GetBytes(S));
      }
      

      【讨论】:

        【解决方案4】:

        UTF8Encoding Class

           UTF8Encoding uni = new UTF8Encoding();
           Console.WriteLine( uni.GetString(new byte[] { 1, 2 }));
        

        【讨论】:

          【解决方案5】:

          有不同类型的编码。您可以尝试其中一些,看看您的字节流是否正确转换:

          System.Text.ASCIIEncoding encodingASCII = new System.Text.ASCIIEncoding();
          System.Text.UTF8Encoding encodingUTF8 = new System.Text.UTF8Encoding();
          System.Text.UnicodeEncoding encodingUNICODE = new System.Text.UnicodeEncoding();
          
          var ascii = string.Format("{0}: {1}", encodingASCII.ToString(), encodingASCII.GetString(textBytesASCII));
          var utf =   string.Format("{0}: {1}", encodingUTF8.ToString(), encodingUTF8.GetString(textBytesUTF8));
          var unicode = string.Format("{0}: {1}", encodingUNICODE.ToString(), encodingUNICODE.GetString(textBytesCyrillic));
          

          也请看这里:http://george2giga.com/2010/10/08/c-text-encoding-and-transcoding/

          【讨论】:

            【解决方案6】:
            var ascii = $"{new ASCIIEncoding().ToString()}: {((ASCIIEncoding)new ASCIIEncoding()).GetString(textBytesASCII)}";
            var utf = $"{new UTF8Encoding().ToString()}: {((UTF8Encoding)new UTF8Encoding()).GetString(textBytesUTF8)}";
            var unicode = $"{new UnicodeEncoding().ToString()}: {((UnicodeEncoding)new UnicodeEncoding()).GetString(textBytesCyrillic)}";
            

            【讨论】:

              【解决方案7】:

              写了一个循环将字符串中的unicode符号转换为UTF8字母:

              string stringWithUnicodeSymbols = @"{""id"": 10440119, ""photo"": 10945418, ""first_name"": ""\u0415\u0432\u0433\u0435\u043d\u0438\u0439""}";
              var splitted = Regex.Split(stringWithUnicodeSymbols, @"\\u([a-fA-F\d]{4})");
              string outString = "";
              foreach (var s in splitted)
              {
                  try
                  {
                      if (s.Length == 4)
                      {
                          var decoded = ((char) Convert.ToUInt16(s, 16)).ToString();
                          outString += decoded;
                      }
                      else
                      {
                          outString += s;
                      }
                  }
                  catch (Exception e)
                  {
                      outString += s;
                  }
              }
              

              【讨论】:

                猜你喜欢
                • 2010-12-28
                • 2017-03-03
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2010-09-27
                • 2020-07-03
                相关资源
                最近更新 更多