3

我需要使用 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

4

5 回答 5

8

怎么样:

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

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

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

于 2009-09-30T17:02:59.967 回答
3

编码 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。

于 2009-09-30T17:04:37.310 回答
1

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

请阅读每个软件开发人员绝对、绝对必须了解 Unicode 和字符集的绝对最低要求(没有借口!)

于 2012-02-02T13:31:16.550 回答
0

不知道这是否应该在这里发布,但我在 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 
}
于 2012-02-06T09:55:45.730 回答
0

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

尝试将变量“输入”作为 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);
于 2009-09-30T17:04:40.890 回答