2009-09-30 260 views
3

我需要使用VB.NET將UTF8字符串轉換爲ISO-8859-1字符串。將UTF8字符串編碼爲ISO-8859-1字符串(VB.NET)

任何示例?


強調文本我曾嘗試拉丁功能,而不是運行。我收到錯誤的字符串。

我的情況是我需要使用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() 

但不運行...我收到不正確的消息。例如

如果我寫:MANANA返回MAA ANA

怎麼樣,如果我寫艾瓜返回AIGA

+0

沒有。我沒有得到任何解決方案在100%下運行良好。如果沒有,我會標記爲已解決...對不起... – aco 2012-03-15 15:08:29

+0

不,我問,你有什麼試過?這個「問題」只是要求某人告訴你該做什麼,沒有先前研究的證據。 – 2012-03-15 16:14:24

+0

我不明白你的意思....只有我知道那個問題是在3年前開的! – aco 2012-03-15 17:02:49

回答

8

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

即假定當你說的「UTF8字符串」你的意思是「二進制數據是UTF-8的代表重刑的一些文字「。如果你的意思是別的,請說明:)

請注意,ISO-8859-1只代表完整Unicode的一小部分。 IIRC,你會以「?」結束對於來自ISO-8859-1中不可用的源數據的任何字符。

+0

感謝您的「?」參考,它只是今天救了我。 – Hallaghan 2012-07-12 17:42:07

+0

@jonskeet,我對你使用「tiny」這個詞提出質疑。從技術上講,你可能是正確的,但大部分Unicode對大多數應用程序來說都是不相關的。本頁面有ISO-8859-1中的「完整覆蓋」約30種現代語言列表。 Spoiler:其中之一是西班牙文:https://en.wikipedia.org/wiki/ISO/IEC_8859-1 – JoelFan 2017-09-01 18:23:53

+1

@JoelFan:除非用西班牙文寫作的人也想包括表情符號,或者不是' t *西班牙語,或來自不同語言的文字等。我認爲一個僅限於ISO-8859-1的應用程序在現代世界中是相當有問題的。每當開發人員有選擇時,我建議使用UTF-8。 – 2017-09-01 18:26:24

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 

編輯完成得到這個編碼

正如喬恩指出,這可能是人們更容易記住十進制數28591而不是十六進制數& H6FAF。

+0

爲什麼使用&H6FAF當十進制文字28591更容易記住(如果你知道你是在8859-1之後)? – 2009-09-30 17:06:03

+1

@Jon,因爲我使用了反射器,它輸出的是十六進制數字:) – JaredPar 2009-09-30 17:12:14

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 
}