forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   Основной форум (http://forum.boolean.name/forumdisplay.php?f=49)
-   -   Конвертирование кодировки utf для отображk (http://forum.boolean.name/showthread.php?t=7197)

Phantom 18.10.2008 02:12

Ответ: Конвертирование кодировки utf для отобра&
 
Даже если это двухбайтный юникод, будут крякозябры! Объясняю ещё раз. Считываем побайтно и приписываем каждый байт по очереди к строке. А каждый байт (БАЙТ, но не СИМВОЛ) в строке становится юникодным. Тебе ВО ВРЕМЯ ЧТЕНИЯ из интернета нужно по два байта объединять и только тогда присоединять к строке. Типа считываешь один байт, умножаешь его на 256, потом считываешь второй байт, прибавляешь его к предыдущему И ТОЛЬКО ПОСЛЕ ЭТОГО присоединяешь то, что получилось, с меткой (char) к строке.
- - -
Только дописал и сообразил, что у тебя не двухбуйтный юникод. Юникод ведь не так вроде в файлах хранят. У тебя скорее всего UTF-8. Вот моя функция как раз парсит принимаемый поток байт. Она имеет 4 "буферных" байта:
int b1,b2,b3,b4;
Именно четыре байта нужно, чтобы хранить самые "большие" символы в UTF-8. А из скольки именно состоит символ можно узнать по первому байту. Вот так и парсится поток. Но чуть сложнее, чем я выше описал, так как нужно ещё в юникод перевести полученный текст. Кто серьёзно хочет вникнуть, прочитайте в википедии про UTF-8 и UNICODE, и зацените же, наконец, мою функцию. Я старался =) Поймите же, мультибайтные кодировки просто так в строку не запишешь в Java (да и вообще наверное нигде).
- - -
Я не знаю, как ещё понятнее объяснить. В Java в строках используется ВСЕГДА UNICODE. Если мы что-то присваиваем к строковой переменной, то каждый "байт" в этой строке имеет код юникода (то есть он может быть и больше 255, то есть это не байт даже, а символ). Даже если вы считываете однобайтную кодировку типа ANSI, то при присваивании такого текста строке происходит конвертация в юникод ВСЕХ символов с кодами больше 127 (те, что меньше 128 и в юникоде тоже один байт). То есть КОДЫ БАЙТОВ меняются и становятся больше 255. Байт имеет свой старый код, пока его не приконкатенировали к строке.
- - -
Ща напишу функцию, которая будет при вызове считывать ОДИН символ из потока (UTF-8). Но это совершенно НЕ ОЗНАЧАЕТ, что из потока при вызове этой функции будет считатан ровно один байт. Если байт в потоке не в UTF-8, то... Даже хз пока что будет, так как парсер сбиться может. Подумаю ещё.

Phantom 18.10.2008 04:03

Ответ: Конвертирование кодировки utf для отобра
 
Сделал либу для мидлет паскаля. Точнее сказать, переписал предыдущую. Результаты ужасные. Убрал из либы цикл, открытие/закрытик ресурса, кое-что переделал, то есть цикл для считывания и открытие/закрытие ресурса теперь надо в паскале организовывать. Организовал. Считывание стало в десятки раз медленнее!!! Вот это жо..а! Раньше на Сименсе длинный текст открывался за 700 с чем-то милисекунд, а сейчас я вообще не дождался. Укоротил текст раз в 50, тогда только открыл за две секунды. Видимо и длинный открыл бы... Минуты через две... Полагаю, либу выкладывать нет смысла. Нужно цикл в java организовывать, а не в паскале...

Kurdt 21.10.2008 18:21

Re: Конвертирование кодировки utf для отображ&
 
Наконецто, для русского языка написал

PHP код:

//**********************************************************

function toUtf8code(Ststring): string;
var
  
i,n,prInteger;
  
s:string;
  
ch,old:char;
  
oldisruKey:boolean;
begin
n
:=0;
oldisruKey:=false;
for 
i:=0 to length(st)-1do 
            
begin            
            ch
:=getChar(st,i);
            
n:=ord(ch);
            If 
n<208 then if not oldisruKey then s:=s+ch;
            if 
oldisruKey then 
                begin
            
if old=chr(208)  then begin
                    s
:=s+chrstringtointeger((integertostring((ord(ch))  +896) )));
                    
end;

            if 
old=chr(209)  then begin
                    s
:=s+chrstringtointeger((integertostring((ord(ch))  +960) )));
                    
end;


                    
oldisruKey:=false;
                
end;


if 
ch>=chr(208then oldisruKey:=true;

old:=ch//208 154


                      
end;
        
toUtf8code:=s;
end;

//1106 8216 


Scader 22.10.2008 13:07

Ответ: Re: Конвертирование кодировки utf для отобра
 
function trans(s: string):string;
var s1: string;
gc: integer;
begin
s1:='';
for i:=0 to length(s) do
begin
gc:=ord(getChar(s,i));
if (gc>223) then
begin
s1:=s1+chr(848+gc);
end;
if (gc<223) then
begin
s1:=s1+chr(gc);
end;
end;
trans:=s1;
end;

у меня этот код работает, если я получаю данные из нета (перекодирует маленькие русские буквы, а латиницу и другие символы оставляет без изменения), а вот с ресурсами хуже, еще не разобрался, тот код, который выложен выше у меня не работает

Kurdt 22.10.2008 13:38

Re: Конвертирование кодировки utf для отображ&
 
Scader это если исходная 1251 то да в моем случае получаю utf8 строку кодирую её в юникод телефона
в utf8 русские символы = 2 байта латиница ипр символы до 128 - 1 байт

odd 24.10.2008 07:00

Ответ: Конвертирование кодировки utf для отобра
 
А перекодировщик из UTF8 обратно в Win у кого нибудь есть?
Просто если ищешь какое-то слово в файле ресурсов, то быстрее уже искать Win слово чем каждую строку переконвертировать в UTF8 и затем уже искать.

Phantom 24.10.2008 16:08

Ответ: Конвертирование кодировки utf для отобра
 
А ты считай ресурс в строку и в ней ищи.

odd 25.10.2008 06:49

Ответ: Конвертирование кодировки utf для отобра&#10
 
Цитата:

Сообщение от Phantom_wc (Сообщение 89384)
А ты считай ресурс в строку и в ней ищи.

Та ну нафиг. А если ресурс занимает мегабайт? Так и оперативки не хватит. Там и так поиск придется делать в несколько потоков...

Phantom 25.10.2008 09:30

Ответ: Конвертирование кодировки utf для отобра
 
О_о... Я читал, что некоторые телефоны при открытии ресурса сразу в оперативу файл помещают, независимо от того, читаешь ты из него что-то или нет. Вроде про нокии так написано было. И поэтому, я считаю, что такой огромный ресурс и класть в прогу не стоит. гг

odd 26.10.2008 07:58

Ответ: Конвертирование кодировки utf для отобра
 
Я лично наблюдал, что даже на тормознутом сименсе работает англо/русский словарь, размером в распакованном виде чуть более 2 Мб, а ведь там оперативки мало. Хотя на Нокии может быть всё что угодно.

Phantom 10.11.2008 05:12

Ответ: Конвертирование кодировки utf для отобра
 
О_о Офигеть... В инструкции к семёнам я читал, что они могут работать с Джава приложениями, размер которых не превышает 360 килобайт. И действительно, сколько приложений я пытался ставить хотя бы немного превышающие этот лимит, приложение не запускалось и выдавало какую-то ошибку. Какую именно понятия не имею, это было ещё во времена, когда я даже не знал, что такое php, не то что Java =)

Romanzes 10.11.2008 11:59

Ответ: Конвертирование кодировки utf для отобра&
 
Я запускал на своем древнем семёне java-книгу размером >700 КБ. Качал через оперу мини, потому что стандартный браузер не позволяет скачивать такие большие приложения.

Ultimat 28.03.2009 20:15

Ответ: Конвертирование кодировки utf для отобра
 
Помогите!!! как с этими кодировками работать!?? я реально уже целый день с ними справится не могу сил уже нет!!! пользуюсь либой encoding, на хосте в UTF8 ответ отправляю, из какой кодировки в какую переводит? когда данные отправляю и получаю.

ViNT 28.03.2009 21:03

Ответ: Конвертирование кодировки utf для отобра
 
По идее, если сразу UTF-8 отправляется, то ничего конвертировать не надо, но на деле бывают всякие непонятные проблемы.

Ultimat 28.03.2009 21:24

Ответ: Конвертирование кодировки utf для отобра
 
Вот данные из интернета я обрабатываю через функцию которую выше написал Kurdt, у меня кирилица нормально отображаеться, дайте пожалуиста функцию чтобы GET POSR запросы обробатывать перед отправкой, и фообще в какой кодировке в телефоне тект который я в нем набираю


Часовой пояс GMT +4, время: 04:11.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot