Бинарник и Utf-8

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
18
#1
Собственно имеем ситуацию, берем и открываем файл через нотесстрим как бинарный и работаем с ним.
Всё бы хорошо но там содержится уникод - русские и украинские буквы
Это приводит к тому, что нужно прочитать ДВА байта а не один, и собрать в стринг из них ОДНУ букву
Тоесть к примеру, глядя бинарник мы видим: D0 9F - это соответствует русской букве "П", уникод этой буквы 1055
Сразу выбил формулу, что если взять два байта то стринг мы получим
s1 = Uchr$(b1*256+b2-52352)
тоесть D0 9F я преобразовал в букву "П"
так вот мне интересно откуда взялась эта цифра 52352??
Подозреваю, что она сильно зависит от первого байта
Есть где нибудь правила уникода? :)
 

Akupaka

А че я?.. О.о
04.10.2007
3 360
1
#2
Всё бы хорошо но там содержится уникод - русские и украинские буквы
Вообще-то, сама кириллица это не юникод еще.

Тоесть к примеру, глядя бинарник мы видим: D0 9F - это соответствует русской букве "П"
Уникод буквы "П" (1055) = H041F, Это UTF-16.
А откуда твоя формула? Просто придумал? :)

Твой файл, из твоего описания, записан в UTF-8.
Преобразование из Unicode to UTF-8.
Символы Unicoda в диапазоне 0x00000080 — 0x000007FF записываются в виде двух байт 110xxxxx 10xxxxxx
Т.е. 11 бит размещаются в двух байтах так: 5 бит в старшем байте, 6 - в младшем.
"П" = UTF-8 Hex D09F = UTF-8 Bin 1101 0000 1001 1111 -> Unicode Bin 0000 0100 0001 1111 = Unicode Hex 041F

Откуда цифра 52352? :) Из твоей формулы - ты ее обратным вычислением получил.
Вот тут посмотри про формирование UTF-8 http://ru.wikipedia.org/wiki/UTF-8
 

VladSh

начинающий
Lotus team
11.12.2009
1 262
6
#3

ToxaRat

Чёрный маг
Lotus team
06.11.2007
3 231
18
#5
Akupaka
Преобразование из Unicode to UTF-8.
Символы Unicoda в диапазоне 0x00000080 — 0x000007FF записываются в виде двух байт 110xxxxx 10xxxxxx
Т.е. 11 бит размещаются в двух битах так: 5 бит в старшем байте, 6 - в младшем.
"П" = UTF-8 Hex D09F = UTF-8 Bin 1101 0000 1001 1111 -> Unicode Bin 0000 0100 0001 1111 = Unicode Hex 041F
благодарствую, это именно то что нужно! :)
а цифру я да, от обратного получил, но при пересечении русско/украинского она становилась не верной