Кодирование строки UTF8 в строку ISO-8859-1 (VB.NET)

Мне нужно преобразовать строку UTF8 в строку ISO-8859-1 с помощью VB.NET.

Любой пример?


выделенный текст Я пробовал использовать латинскую функцию, но не запускается. Я получаю неверную строку.

В моем случае мне нужно отправить SMS через 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


person aco    schedule 30.09.2009    source источник
comment
никто. Я не получил ни одного решения, которое бы работало на 100%. в противном случае я бы отметил, что это решено ... извините ...   -  person aco    schedule 15.03.2012
comment
Нет, я спросил, что вы пробовали? Этот вопрос просто просит кого-то сказать вам, что делать, без каких-либо доказательств предыдущих исследований.   -  person Lightness Races in Orbit    schedule 15.03.2012
comment
Я не понимаю, что вы сказали .... только я знаю, что этот вопрос был открыт 3 года назад!   -  person aco    schedule 15.03.2012
comment
Я не понимаю, насколько то, что я сказал, было сложным или трудным для понимания.   -  person Lightness Races in Orbit    schedule 15.03.2012
comment
Вы хотите сказать, что ответ Джона Скита на самом деле не отвечал на ваш вопрос? Потому что в противном случае вопрос не имеет смысла. UTF8 и ISO-8859-1 - это кодировки текста Unicode. В .NET строка всегда находится в формате Unicode в памяти, и только тогда, когда вы хотите преобразовать ее в байтовый массив (обычно потому, что вам нужно сохранить ее в двоичном файле или отправить по сети), вы включаете кодирование Это. Ответ Джона Скитса был точным и правильным для поставленного вопроса. Если нет, я закрываю это как слишком локализованный, поскольку тогда явно вопрос неправильный.   -  person Lasse V. Karlsen    schedule 16.03.2012
comment
мои извинения. Хорошо, пример Джона работает хорошо ... может быть проблема с моим поставщиком веб-услуг. Теперь я управляю и заменяю некоторые символы перед их отправкой и хорошо работает.   -  person aco    schedule 02.06.2012


Ответы (5)


Как насчет:

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

Это предполагает, что когда вы говорите «строка UTF8», вы имеете в виду «двоичные данные, которые представляют собой представление некоторого текста в кодировке UTF-8». Если вы имеете в виду другое, уточните :)

Обратите внимание, что ISO-8859-1 представляет собой лишь небольшую часть полного Unicode. IIRC, вы получите "?" для любого символа из исходных данных, который недоступен в ISO-8859-1.

person Jon Skeet    schedule 30.09.2009
comment
Спасибо за ? ссылка, это просто случайно меня сегодня спасло. - person Hallaghan; 12.07.2012
comment
@jonskeet, я не согласен с тем, что вы используете слово крошечный. Технически вы можете быть правы, но также верно и то, что огромная часть Unicode не имеет отношения к большинству приложений. На этой странице есть список из примерно 30 современных языков с полным охватом в ISO - 8859-1. Спойлер: один из них - испанский: en.wikipedia.org/wiki/ISO/IEC_8859- 1 - person JoelFan; 01.09.2017
comment
@JoelFan: Если кто-то, пишущий на испанском, также не захочет включить смайлик, или имя того, кто не испанский, или слово из другого языка и т. Д., Я рассматриваю приложение, которое ограничено ISO-8859-1 быть довольно проблематичным в современном мире. Когда у разработчика есть выбор, я бы посоветовал использовать UTF-8. - person Jon Skeet; 01.09.2017
comment
Я согласен с вами в этом на 100%, но мне показалось, что использованная терминология вводит в заблуждение. - person JoelFan; 01.09.2017
comment
@JoelFan: Я действительно поддерживаю это. Это очень небольшая часть полного набора Unicode, и, учитывая такую ​​популярность эмодзи (и множество других вариантов использования), я думаю, что он подойдет только для очень небольшого подмножества приложений. - person Jon Skeet; 01.09.2017
comment
@JonSkeet, возможно, вас заинтересует мой недавний вопрос ... stackoverflow.com/questions/46006463/ - person JoelFan; 01.09.2017

Кодировку 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.

person JaredPar    schedule 30.09.2009
comment
Зачем использовать & H6FAF, если десятичный литерал 28591 легче запомнить (если вы знаете, что после 8859-1)? - person Jon Skeet; 30.09.2009
comment
@Jon, потому что я использовал отражатель, и он выводил шестнадцатеричные числа :) - person JaredPar; 30.09.2009

Я предполагаю, что System.Text.Encoding.GetEncoding("ISO-8859-1") не поддерживает ñ, в этом случае вам нужно использовать другой тип кодировки для SMS.

Прочтите Абсолютный минимум, который должен знать каждый разработчик программного обеспечения о Unicode и наборах символов (без оправданий!)

person Daniel Tiru    schedule 02.02.2012

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);
person Omar    schedule 30.09.2009

Не знаю, следует ли это размещать здесь, но я сделал небольшую функцию на 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 
}
person Daniel Tiru    schedule 06.02.2012