Господа, я слегка не понимаю как может один символ в кодировке UTF-8 быть представлен 4-6 байтами ?
КАК потом процессор сливает эти байты для того чтобы получить один байт для отображения символа ?
Вот этот алгоритм очень интересен ?
А не всякие пространные статьи о том как появилась эта кодировка да зачем она нужна как в википедии !
Здравствуйте, <Аноним>, Вы писали:
А> А не всякие пространные статьи о том как появилась эта кодировка да зачем она нужна как в википедии !
Тогда вам сюда
... << RSDN@Home 1.2.0 alpha 4 rev. 1090>>
Re: UTF-8
От:
Аноним
Дата:
18.05.09 07:12
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Господа, я слегка не понимаю как может один символ в кодировке UTF-8 быть представлен 4-6 байтами ?
Если "символ" имеется ввиду unicode то 6-ю — нет. А вот 4-мя — да.
Re: UTF-8
От:
Аноним
Дата:
18.05.09 07:17
Оценка:
напрямую работать с юникодом (кодированным больше чем одним байтом на символ) в опкодах процессора, наверное, никак. зато есть поддержка в ЯВУ
Здравствуйте, Аноним, Вы писали:
А>Господа, я слегка не понимаю как может один символ в кодировке UTF-8 быть представлен 4-6 байтами ? А> КАК потом процессор сливает эти байты для того чтобы получить один байт для отображения символа ? А> Вот этот алгоритм очень интересен ? А> А не всякие пространные статьи о том как появилась эта кодировка да зачем она нужна как в википедии !
Здравствуйте, Аноним, Вы писали: А>Господа, я слегка не понимаю как может один символ в кодировке UTF-8 быть представлен 4-6 байтами ? А> КАК потом процессор сливает эти байты для того чтобы получить один байт для отображения символа ?
А зачем потом сливать эти байты? Почему это для отображения нужен именно 1 байт?
Если тебя интересует отображение символов на экране в текстовом режиме — погугли, как реализованы консольные шрифты в линупсе. Но суть приблизительно в том, что юникод преобразовывается в однобайтную кодировку, т.е. с поддержкой только латиницы и еще одного алфавита.
UTF-8
От:
Аноним
Дата:
18.05.09 07:34
Оценка:
#Имя:
FAQ.unicode
Здравствуйте, Аноним, Вы писали:
>Господа, я слегка не понимаю как может один символ в кодировке UTF-8 быть представлен 4-6 байтами ?
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, Аноним, Вы писали: А>>Господа, я слегка не понимаю как может один символ в кодировке UTF-8 быть представлен 4-6 байтами ? А>> КАК потом процессор сливает эти байты для того чтобы получить один байт для отображения символа ? MC>А зачем потом сливать эти байты? Почему это для отображения нужен именно 1 байт? MC>Если тебя интересует отображение символов на экране в текстовом режиме — погугли, как реализованы консольные шрифты в линупсе. Но суть приблизительно в том, что юникод преобразовывается в однобайтную кодировку, т.е. с поддержкой только латиницы и еще одного алфавита.
А говорите зачем вам 1 байт — затем чтобы точно указать какой символ надо нарисовать .
А тогда если используется 1-6 байт для задания адреса этого нужного символа то как по какому алгоритму формируется этот самый адрес(указатель)?
Эти 1-6 байт подвергают логическому сложению вычитанию логическому или может быть просто сложению ?
И потом если это адрес по анилогии с адресом в памяти компьютера он должен иметь конкретный вид в виде адреса а не в виде разрозненых байт .
Здравствуйте, Аноним, Вы писали:
А> А говорите зачем вам 1 байт — затем чтобы точно указать какой символ надо нарисовать .
Блин, почему именно 1 байт-то? Не 2, не 4, не 8,а имеенно 1?
А> А тогда если используется 1-6 байт для задания адреса этого нужного символа то как по какому алгоритму формируется этот самый адрес(указатель)?
Какой еще адрес? Если тебе нужно получить значение юникодного кодпоинта — пожалуйста, это достигается перестановкой бит (см. википедийную статью о utf-8). Если тебе нужно выдернуть глиф из шрифта — надо смотреть описание формата этого шрифта, наверняка кодпоинт действительно преобразуется в какой-то адрес в файле (но вряд ли этот адрес состоит из 1 байта ). Короче, скажи, что конкретно ты хочешь сделать юникодной строкой.
Здравствуйте, Аноним, Вы писали:
А>Господа, я слегка не понимаю как может один символ в кодировке UTF-8 быть представлен 4-6 байтами ? А> КАК потом процессор сливает эти байты для того чтобы получить один байт для отображения символа ? А> Вот этот алгоритм очень интересен ? А> А не всякие пространные статьи о том как появилась эта кодировка да зачем она нужна как в википедии !
Прочитай стандарт и посмотри исходники утилит и библиотек, в которых реализована работа с этой кодировкой.
Re[4]: UTF-8
От:
Аноним
Дата:
18.05.09 10:08
Оценка:
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, Аноним, Вы писали:
А>> А говорите зачем вам 1 байт — затем чтобы точно указать какой символ надо нарисовать . MC>Блин, почему именно 1 байт-то? Не 2, не 4, не 8,а имеенно 1?
А>> А тогда если используется 1-6 байт для задания адреса этого нужного символа то как по какому алгоритму формируется этот самый адрес(указатель)? MC>Какой еще адрес? Если тебе нужно получить значение юникодного кодпоинта — пожалуйста, это достигается перестановкой бит (см. википедийную статью о utf-8). Если тебе нужно выдернуть глиф из шрифта — надо смотреть описание формата этого шрифта, наверняка кодпоинт действительно преобразуется в какой-то адрес в файле (но вряд ли этот адрес состоит из 1 байта ). Короче, скажи, что конкретно ты хочешь сделать юникодной строкой.
ТАК я так и говорю, что пытаюсь декодировать последовательность
!B@>:0A@CAA:8<B5:AB>< — вот так предствлена строка
А вот так она должна была выводиться: "Строка с русским текстом"
Здравствуйте, Аноним, Вы писали: А>!B@>:0A@CAA:8<B5:AB>< — вот так предствлена строка
Где ты видишь строку в таком виде (например, если ты выводишь ее на экран, то покажи исходник программы)? Откуда ты эту строку получил? Как строка у тебя хранится (например, в char* или wchar* или еще как-то)? В какой она кодировке?
Re[6]: UTF-8
От:
Аноним
Дата:
18.05.09 11:18
Оценка:
Здравствуйте, Mr.Cat, Вы писали:
MC>Здравствуйте, Аноним, Вы писали: А>>!B@>:0A@CAA:8<B5:AB>< — вот так предствлена строка MC>Где ты видишь строку в таком виде (например, если ты выводишь ее на экран, то покажи исходник программы)? Откуда ты эту строку получил? Как строка у тебя хранится (например, в char* или wchar* или еще как-то)? В какой она кодировке?
Х.З. в какой она кодировке это строка в браузер выводится .
test.js формирует документ и отправляет в XPCOM компанент который в памяти висит строку .
Другой процедурой в этом же test.js он слушает строку от xpcom и показывает ее на экране.
Отправляет строку он в char* И слушает тоже в нем.
test.js отправляет строку скажем "Строка с русским текстом";
А получает он !B@>:0A@CAA:8<B5:AB
У меня есть сильные подозрения, что читая побайтно т.е. char он не видит связи с соседними байтами в которых как раз и скрыт UTF-8
Надо бы в wchar_t читать но этого не может сделать .js
А так как он читает побайтно то надо как то обьединить прочитанные байты для получения UTF — по 2 бай та по 4 ..... пока не ясно.
И как их объединить тоже пока не понятно.
Может быть так — читать строку char-оф по 2 байта и проверять на маску каждый байт на >128 и как только >128 то читать второй байт и && два байта чтобы выяснить код русской буквы.
Здравствуйте, Mr.Cat, Вы писали:
MC>Если тебя интересует отображение символов на экране в текстовом режиме — погугли, как реализованы консольные шрифты в линупсе. Но суть приблизительно в том, что юникод преобразовывается в однобайтную кодировку, т.е. с поддержкой только латиницы и еще одного алфавита.
В однобайтную ли?
То есть, китайский текстовый режим недоступен? (Хотя в ДОС как-то это умели).
И к тому же, линукс умеет и любит эмулировать текстовый режим графикой, с произвольными консольными шрифтами. Может, и utf-8 поддерживает?
function utf8to16(str) {
var out, i, len, c;
var char2, char3;
out = "";
len = str.length;
i = 0;
while(i < len) {
c = str.charCodeAt(i++);
switch(c >> 4)
{
case 0: case 1: case 2: case 3: case 4: case 5: case 6: case 7:
// 0xxxxxxx
out += str.charAt(i-1);
break;
case 12: case 13:
// 110x xxxx 10xx xxxx
char2 = str.charCodeAt(i++);
out += String.fromCharCode(((c & 0x1F) << 6) | (char2 & 0x3F));
break;
case 14:
// 1110 xxxx 10xx xxxx 10xx xxxx
char2 = str.charCodeAt(i++);
char3 = str.charCodeAt(i++);
out += String.fromCharCode(((c & 0x0F) << 12) |
((char2 & 0x3F) << 6) |
((char3 & 0x3F) << 0));
break;
}
}
return out;
}
utf8to16() сойдет только для валидных utf8 строк, т.е. ошбки в входной строке она не распознает
Re[5]: UTF-8
От:
Аноним
Дата:
18.05.09 14:25
Оценка:
А>>> А тогда если используется 1-6 байт для задания адреса этого нужного символа то как по какому алгоритму формируется этот самый адрес(указатель)? MC>>Какой еще адрес? Если тебе нужно получить значение юникодного кодпоинта — пожалуйста, это достигается перестановкой бит (см. википедийную статью о utf-8). Если тебе нужно выдернуть глиф из шрифта — надо смотреть описание формата этого шрифта, наверняка кодпоинт действительно преобразуется в какой-то адрес в файле (но вряд ли этот адрес состоит из 1 байта ). Короче, скажи, что конкретно ты хочешь сделать юникодной строкой. А> ТАК я так и говорю, что пытаюсь декодировать последовательность А> !B@>:0A@CAA:8<B5:AB>< — вот так предствлена строка А> А вот так она должна была выводиться: "Строка с русским текстом"
Вывод строки — это рисование ее на графическом девайсе. Экране или принтере. Для этого кажыдй символ в один байт представлять совсем необязательно. Алгоритм простой
1) Декодируем от одного до нескольких байт, которые должны выводиться как один символ.
2) Рисуем этот символ. Именно рисуем — битмап выводим на девайс. Для этого представление в \один байт\ не нужно.
3) Если не конец строки — переходим на 1)
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, Mr.Cat, Вы писали:
MC>>Если тебя интересует отображение символов на экране в текстовом режиме — погугли, как реализованы консольные шрифты в линупсе. Но суть приблизительно в том, что юникод преобразовывается в однобайтную кодировку, т.е. с поддержкой только латиницы и еще одного алфавита.
К>В однобайтную ли? К>То есть, китайский текстовый режим недоступен? (Хотя в ДОС как-то это умели).
А сколько нужно для китайского? Честно говоря, мне почему-то запомнился максимум 512 символов (либо 256 + возможность иметь другое начертание — например, жирное). Впрочем, могу заблуждаться — надо гуглить.
К>И к тому же, линукс умеет и любит эмулировать текстовый режим графикой, с произвольными консольными шрифтами. Может, и utf-8 поддерживает?
Как оно при фреймбуффере — я тем более хз.
Здравствуйте, <Аноним>, Вы писали:
А> ТАК я так и говорю, что пытаюсь декодировать последовательность А> !B@>:0A@CAA:8<B5:AB>< — вот так предствлена строка
Похоже на UUEncode, но не UUEncode.
Либо это срезка — кривая трансляция 8-битной кодировки (в т.ч. мультибайтной) в 7-битную. Срезка иногда возникает при копипасте через не-юникодные программы или не-юникодные шрифты.
Может быть, ты попробуешь не наобум декодировать, а узнаешь сам и расскажешь нам, каким способом закодирован этот текст.
Если с этим возникают сложности, то покажи — откуда ты взял текст. Вдруг там рядом есть какие-нибудь заголовки (MIME или ещё что), из которых станет ясно.
А то вдруг окажется, что это ты прочёл зазипованный поток, и сперва нужно его раззиповать
Здравствуйте, Mr.Cat, Вы писали:
К>>То есть, китайский текстовый режим недоступен? (Хотя в ДОС как-то это умели). MC>А сколько нужно для китайского? Честно говоря, мне почему-то запомнился максимум 512 символов (либо 256 + возможность иметь другое начертание — например, жирное). Впрочем, могу заблуждаться — надо гуглить.
Э, я с китайским досом только в ознакомительных целях ознакомлялся (точнее, с китайским win95).
Точно помню, что по два байта на символ.
А вообще, китайская кодовая страница здоровая, точно больше 512 иероглифов.
К>>И к тому же, линукс умеет и любит эмулировать текстовый режим графикой, с произвольными консольными шрифтами. Может, и utf-8 поддерживает? MC>Как оно при фреймбуффере — я тем более хз.
Во. ключевое слово "фреймбуфер". Погуглю на досуге.
Здравствуйте, Аноним, Вы писали: А> test.js формирует документ и отправляет в XPCOM компанент который в памяти висит строку .
А ты вот эту штуку читал: https://developer.mozilla.org/en/XPCOM_string_guide ? Может, у тебя проблема в том, что у тебя в idl тип возвращаемого значения задекларирован как string — и жаваскриптовский код клал на кодировки?
Re: UTF-8
От:
Аноним
Дата:
19.05.09 08:28
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
>>Господа, я слегка не понимаю как может один символ в кодировке UTF-8 быть представлен 4-6 байтами ?
А>Прочитай вот эту неплохую статью для начинающих.
Если уж про почитать, то курить книгу: Фень Юань — Программирование графики в Windows 2000, там и про устройство, и про хранение и про реализацию.