UTF-8 в Windows 1251

Язык Visual Basic на платформе .NET.

Модераторы: Ramzes, Sebas

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

UTF-8 в Windows 1251

Сообщение Maitris » 13.10.2006 (Пт) 21:45

Перерыл все пространство имен System.Text, конвертил из одной кодировки в другую, из чар в байты, из байтов в чар, потом в строки, но так и не достиг успеxа :( Xотя по идее должна быть норма.

В общем есть такого рода сорц:
Торговля
Известно что это UTF-8 (Юникод).
Как мне получить из этого строку "Торговля" в кодировке Windows 1251, а не те же символы в этой кодировке?
----

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 13.10.2006 (Пт) 23:36

Ну это не совсем юникод. здесь мы видим мнемонику (&...; ), в которой видим что указаны номера символов (#...), которые (номера) представлены ввиде hex (x...).
Вот этот hex - это 2 байта, представляющих из себя русскую букву в юникоде. М.б. тебе надо выдрать оттуда только эти байты, а потом их перекодировать.
У меня есть функция, где перекодируется юникод и утф-8 в цп1251, но там значения подобраны опытным путём. Т.е. я смотрел какие диапазоны значений как понимает вэб браузер и делал соответствующие правила для конвертера. Если хочешь - могу выложить код или правила отдельно.
Я знаю верный путь

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 13.10.2006 (Пт) 23:52

Информация к размышлению:
Код: Выделить всё
Dim a() As Byte = Encoding.Unicode.GetBytes("Торговля")
Dim Sb As New StringBuilder

For Each B As Byte In a
Sb.Append(B.ToString("X2") & " ")
Next
Debug.WriteLine(Sb.ToString)

22 04 3E 04 40 04 33 04 3E 04 32 04 3B 04 4F 04
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 13.10.2006 (Пт) 23:56

Код: Выделить всё
Encoding.Unicode.GetBytes("Торговля")

А на vb6 есть что-нить подобное?
Я знаю верный путь

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 13.10.2006 (Пт) 23:59

забыл как о страшном сне :D
наврятли
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 14.10.2006 (Сб) 0:19

дополнение:
Код: Выделить всё
Dim Dec As Byte
If Byte.TryParse("1F", Globalization.NumberStyles.HexNumber, Nothing, Dec) Then
    MsgBox(Dec)
End If
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 16.10.2006 (Пн) 13:55

Ну допустим байты вынуты. Что же тогда со смесью вроде cТp?
Как-то некрасиво получается.. Задержка. Имхо тут что-то другое должно быть, нежели парсер. Браузер ведь мгновенно обрабатывает такие тексты.
----

Q2W
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 745
Зарегистрирован: 31.01.2004 (Сб) 20:46
Откуда: Питер

Сообщение Q2W » 16.10.2006 (Пн) 16:06

Maitris писал(а):Ну допустим байты вынуты. Что же тогда со смесью вроде cТp?
Как-то некрасиво получается.. Задержка. Имхо тут что-то другое должно быть, нежели парсер. Браузер ведь мгновенно обрабатывает такие тексты.

Браузер полюбому Т парсит. Без этого никак. М.б. у него есть спец.библиотека, которой может воспользоваться не только он, но мне о такой не известно.
Я знаю верный путь

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 16.10.2006 (Пн) 16:26

xml-процессор подключи и он все поймет

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 16.10.2006 (Пн) 20:45

Изображение

Maitris
Постоялец
Постоялец
 
Сообщения: 656
Зарегистрирован: 02.03.2005 (Ср) 21:00
Откуда: Из другой цивилизации.

Сообщение Maitris » 16.10.2006 (Пн) 22:49

tyomitch
Посмотрел. Но хотелось бы использовать встроенные возможности Vb.net. Ведь он ориентирован на это. Чуствую истина где-то рядом...
Konst_One
А поподробней можно?
----

Nord777
Гуру
Гуру
Аватара пользователя
 
Сообщения: 1144
Зарегистрирован: 22.02.2004 (Вс) 13:15
Откуда: Подольск

Сообщение Nord777 » 16.10.2006 (Пн) 23:38

Выполняет преобразование в строку (оптимизацией не занимался)
Код: Выделить всё
Private Sub Test()
Dim InputStr As String = "Торговля"
Dim Rgx As New Regex("&#x(?<Hex>[0-9A-F]{1,4})", RegexOptions.IgnoreCase)
Dim RMC As MatchCollection = Rgx.Matches(InputStr)
Dim Sh As Short
Dim B(RMC.Count * 2) As Byte
Dim Index As Integer = 0
Dim Tmp As String = ""
Dim RR As New ByteSpliter

For Each M As Match In RMC
tmp = M.Groups.Item("Hex").Value
     If Short.TryParse(Tmp, Globalization.NumberStyles.HexNumber, Nothing, Sh) Then
         RR.WholePiece = Sh
         B(Index) = RR.One
         B(Index + 1) = RR.Two
         Index += 2
     End If
Next

MsgBox(Encoding.Unicode.GetString(B))
End Sub

<StructLayout(LayoutKind.Explicit, Size:=2)> _
Public Class ByteSpliter
    <FieldOffset(0)> Public WholePiece As Short
    <FieldOffset(0)> Public One As Byte
    <FieldOffset(1)> Public Two As Byte
End Class
Microsoft Visual Studio 2008
Microsoft .NET Framework 3.5

Konst_One
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
Аватара пользователя
 
Сообщения: 3041
Зарегистрирован: 09.04.2004 (Пт) 13:47
Откуда: Химки

Сообщение Konst_One » 17.10.2006 (Вт) 15:13

так куда уж подробней 8) Темыч уже тебе дал сслыку на решение :wink:

http://bbs.vbstreets.ru/viewtopic.php?p=6586589#6586589


Вернуться в Visual Basic .NET

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex-бот и гости: 45

    TopList