PDA

Просмотр полной версии : алгоритм UTF-8 -> Win-1251


Глюконатор
22.05.2009, 11:27
Вопщем ай нид хелп...
Ищеццо сабж. Причем не исходник какой-нить проги на С++/Delphi/PHP и т.д., а именно алгоритм. Хотя можно и исходник, если там не используется функций по типу UTFToWin();
Сам нашел многа-многа страничек, где размусолены практически все возможные варианты использования стандартных функций перекодировки того или иного языка, а самого алгоритма - нема =(

Ivan_32
22.05.2009, 12:12
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
[Ссылки могут видеть только зарегистрированные и активированные пользователи]
Тут вот таблица замен вроде есть. Инглиш буквы CP1251 можно найти в английской википедии. Таблица замен и поочередный проход по массиву.

mov ax,ULetter
mov ecx,CP1251_Length
mov esi,U2CPTable
repne scasw
mov al,byte[U2CPTable+ecx+2] ;Смещение на байт с CP1251 символом.
mov byte[ULetter],al ; заменяем символ юникода на наш.
Тут правда один косяк - лишний байт от юникода никуда не денется. Ну вобщем все это в цикл и все дела.
U2CPTable это массив элементов вида:
struc U2CPT
{
.sUnicode dw ?
.sCP1251 db ?
}
Синтаксис FASM=)

Глюконатор
22.05.2009, 17:39
Эм... куль) Осталась тока придумать как реализовать все это в ВПФ =)

Как я понял без смещений тут никак?..

А вот за [Ссылки могут видеть только зарегистрированные и активированные пользователи] спс, нашел там ссыль на табличку кодировки, которой мне так не хватало) Ночью реально думать плохо, ибо не разу на нее не вышел))

Ivan_32
22.05.2009, 20:10
Да можно ж локальным массивом или XML-ем описать(вроде же WPF работает с ним?) Ну по сути это просто тупо перебор элементов связаного списка=)
Кстати как ни странно эта довольная простая штука используется в SEH - там тоже 8-байтовый узел - 4 байта на адрес следущего SEH обработчика и 4 байта на адрес обработчика.
Но я так понимаю алгоритм должен быть максимально быстрым? Если да то вышеописанный будет быстрее нежели всякие арифметические операции, так как тут только обращение и перенос в память а там такты еще тратятся на всякую муть типа прибавления вычитания или че там надо будет сделать. Хотя не факт, щас такая архитектура у процов крутая что movsb вроде как за один такт выполняется о_О
PS: Перенесу ка я в программинг=)

Глюконатор
22.05.2009, 22:08
Массив для меня - самый последний вариант =) А с хмелем впф не пашет =( он при компиляции в этот формат переводит просто, а работать с ним из кода не умеет :'(