【问题标题】:Encoding UTF8 string to ISO-8859-1 String (VB.NET)将 UTF8 字符串编码为 ISO-8859-1 字符串 (VB.NET)
【发布时间】:2010-12-02 17:35:33
【问题描述】:

我需要使用 VB.NET 将 UTF8 字符串转换为 ISO-8859-1 字符串。

有什么例子吗?


强调文本我试过拉丁函数,但没有运行。我收到不正确的字符串。

我的情况是我需要使用 API 发送短信。

现在我有了这个代码:

        baseurl = "http://www.myweb.com/api/sendsms.php"
        client = New WebClient
        client.Headers.Add("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.2; .NET CLR 1.0.3705;)")
        client.Encoding = System.Text.Encoding.GetEncoding("ISO-8859-1")
        client.QueryString.Add("user", user)
        client.QueryString.Add("password", pass)
        client.QueryString.Add("alias", myAlias)
        client.QueryString.Add("dest",  mobile)
        textoSms = Me.mmTexto.Text
        textoSms = System.Web.HttpUtility.UrlEncode(textoSms)
        client.QueryString.Add("message", textoSms)
        data = client.OpenRead(baseurl)
        reader = New StreamReader(data)
        s = reader.ReadToEnd()
        data.Close()
        reader.Close()

但没有运行...我收到不正确的消息。例如

如果我写:mañana 返回 maa ana

如果我写 aigüa 返回 aiga

【问题讨论】:

  • 无。我没有得到任何 100% 运行良好的解决方案。如果不是,我会将其标记为已解决...对不起...
  • 不,我问,你试过什么?这个“问题”只是要求某人告诉你该怎么做,没有先前研究的证据。
  • 我不明白你说什么......只有我知道这个问题是3年前提出的!
  • 我不明白我说的话有多复杂或难以理解。
  • 您是说 Jon Skeet 的回答实际上并没有回答您的问题吗?因为如果没有,这个问题就没有任何意义。 UTF8 和 ISO-8859-1 是 Unicode 文本的编码。在 .NET 中,字符串在内存中始终为 Unicode 格式,只有当您要将其转换为字节数组(通常是因为您需要将其存储在二进制文件中或通过网络发送)时,您才涉及编码它。 Jon Skeets 的回答直截了当,并且正确地解决了手头的问题。如果不是,我会以过于本地化的方式关闭它,因为显然问题是错误的。

标签: vb.net utf-8 character-encoding iso-8859-1


【解决方案1】:

怎么样:

Dim converted as Byte() = Encoding.Convert(utf8, Encoding.UTF8, _
                                           Encoding.GetEncoding(28591))

假设当您说“UTF8 字符串”时,您的意思是“二进制数据,它是某些文本的 UTF-8 表示形式”。如果你的意思是别的,请说明:)

请注意,ISO-8859-1 仅代表完整 Unicode 的一小部分。 IIRC,你最终会得到“?”对于 ISO-8859-1 中不可用的源数据中的任何字符。

【讨论】:

  • 感谢您的“?”参考,今天刚好救了我。
  • @jonskeet,我对你使用“小”这个词有异议。从技术上讲,您可能是正确的,但 Unicode 的很大一部分与大多数应用程序无关也是事实。此页面上的 ISO--8859-1 中有大约 30 种现代语言的列表,其中“完全覆盖”。剧透:其中之一是西班牙语:en.wikipedia.org/wiki/ISO/IEC_8859-1
  • @JoelFan:除非有人用西班牙语写作也想包含一个表情符号,或者一个不是西班牙语的人的名字,或者来自不同语言的单词等。我认为一个仅限于 ISO-8859-1 的应用程序在现代世界中是非常成问题的。每当开发人员有选择时,我建议使用 UTF-8。
  • 我 100% 同意你的观点,但我只是觉得所使用的术语有点误导
  • @JoelFan:我支持它,真的。它只是完整 Unicode 集的一小部分,而且表情符号如此流行(以及许多其他用例),我认为它只适用于一小部分应用程序。
【解决方案2】:

编码 ISO-8859-1 通常称为 Latin-1。您可以通过执行以下操作来获取此编码

Dim latin1 = Text.Encoding.GetEncoding(&H6FAF)

完整的转换可以通过以下方式完成

Public Function ConvertUtf8ToLatin1(Dim bytes As Byte()) As Bytes()
  Dim latin1 = Text.Encoding.GetEncoding(&H6FAF)
  Return Encoding.Convert(Encoding.UTF8, latin1, bytes)
End Function

编辑

正如 Jon 所指出的,人们可能更容易记住十进制数字 28591,而不是十六进制数字 &H6FAF。

【讨论】:

  • 为什么在十进制文字 28591 更容易记住时使用 &H6FAF(如果你知道你在 8859-1 之后)?
  • @Jon,因为我使用了反射器,它正在输出十六进制数字 :)
【解决方案3】:

因为System.Text.Encoding.GetEncoding("ISO-8859-1")不支持ñ是我的猜测,在这种情况下你需要为你的短信使用另一种编码类型。

请阅读The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets (No Excuses!)

【讨论】:

    【解决方案4】:

    http://msdn.microsoft.com/en-us/library/system.text.encoding.convert.aspx

    尝试将变量“input”作为 UTF-8 字符串;

    VB.NET:

    Dim result As Byte() = Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("iso-8859-1"), input);
    

    C#:

    byte[] result = Encoding.Convert(Encoding.UTF8, Encoding.GetEncoding("iso-8859-1"), input);
    

    【讨论】:

      【解决方案5】:

      不知道是否应该在这里发布,但我在 C# 中做了一个小函数来检查字符串是否支持目标编码类型。

      希望对你有帮助...

      /// <summary>
      /// Function for checking if a string can support the target encoding type
      /// </summary>
      /// <param name="text">The text to check</param>
      /// <param name="targetEncoding">The target encoding</param>
      /// <returns>True if the encoding supports the string and false if it does not</returns>
      public bool SupportsEncoding(string text, Encoding targetEncoding)
      {
          var btext = Encoding.Unicode.GetBytes(text);
          var bencodedtext = Encoding.Convert(Encoding.Unicode, targetEncoding, btext);
      
          var checktext = targetEncoding.GetString(bencodedtext);
          return checktext == text;
      }
      
      //Call the function demo with ISO-8859-1/Latin-1
      if (SupportsEncoding("some text...", Encoding.GetEncoding("ISO-8859-1")))
      {
          //The encoding is supported
      }
      else
      {
          //The encoding is not supported 
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-01-18
        • 2019-12-17
        相关资源
        最近更新 更多