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)

Kurdt 15.10.2008 18:36

Конвертирование кодировки utf для отображk
 
Ктото знает как utf кодировку перекодировать в родную телефона, чтоб она нормально отображалась в форме
вот пример текста (Чувствуешь, кто-то нежно целует твои РіСѓР±С‹ - это СЏ нежно целую тебя перед СЃРЅРѕРј. РЎРїРѕРєРѕР№РЅРѕР№ ночи!
*)

Phantom 16.10.2008 02:08

Ответ: Конвертирование кодировки utf для отобра
 
http://forum.boolean.name/showthread.php?t=6856

Kurdt 16.10.2008 14:02

Re: Конвертирование кодировки utf для отображ&
 
Спс, щас поробую

Kurdt 16.10.2008 14:50

Re: Конвертирование кодировки utf для отображ&
 
а как передать не ресурс а сроку?

beZ_probleM 16.10.2008 15:52

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

Function StrToUtf8(s: string;): string; // Корректирует русскую кодировку в строках взятых из ресурсов...
var i, c: integer; ch: char; ss: string;
begin
        if (pos(s,chr(65488))<>-1) or (pos(s,chr(65489))<>-1) then begin // если строка содержит русские симовлы, то
                for i:=1 to Length(s) do begin // перебираем строку
                        ch:=GetChar(s,i-1); c:=ord(ch);        // берем по байтику
                        if c=65488 then begin                                // если байт равен 65488, то следующий байт отвечает за русскую букву
                                ss:=ss+CHR(ord(GetChar(s,i))-64384);        // находим русскую букву и запоминаем
                                i:=i+1;                                                                                                                                // это чтобы мы перешли на следующую букву, а не брали следующий байт
                        end
                        else begin
                                if c=65489 then begin                                                // то же самое но с другим байт-кодом
                                        ss:=ss+chr(ord(GetChar(s,i))-64320);
                                        i:=i+1;
                                end
                                else ss:=ss+ch;                                                                                // если это не русская буква, то просто ее добавим
                        end;
                end;
                StrToUtf8:=ss;                                                        // возвращаем откорректированный текст
        end
        else StrToUtf8:=s;                        // если строка не содержала русских букв, то просто ее и возвратим...
end;

...

var str:string;
...

str:=StrToUtf8(тут твоя строка);


у меня работает ;)

Kurdt 16.10.2008 16:39

Re: Конвертирование кодировки utf для отображ&
 
у меня не рабоатет (

beZ_probleM 16.10.2008 17:03

Ответ: Конвертирование кодировки utf для отобра
 
оно работает когда текст в формате UTF-8

Kurdt 16.10.2008 17:32

Re: Конвертирование кодировки utf для отображ&
 
Чувствуешь, кто-то нежно целует твои губы - это я нежно целую тебя перед сном. Спокойной ночи!

это утф 8 но он никак не реагирует...

ViNT 16.10.2008 17:51

Ответ: Конвертирование кодировки utf для отобра
 
Вроде как UTF и UTF-8 разные кодировки, перекодировать нужно. Kurdt, приложи файл в UTF, попробую разобраться, как его перекодировать.

Kurdt 16.10.2008 21:58

Re: Конвертирование кодировки utf для отображ&#107
 
вот http://webfile.ru/2319205
почемуто вложения не работают

Phantom 16.10.2008 23:48

Ответ: Конвертирование кодировки utf для отобра
 
UTF - это, как я понимаю, семейство кодировок. Туда входят UTF-8, UTF-16 и другие. Моя функция преобразует считанный из ресурса текст в UTF-8 в UNICODE, который можно отображать в Java. Перекодируются все возможные символы, любого языка, которые только может отобразить UNICODE/UTF-8 (даже значки всякие прикольные, вот только главное, чтобы тел их поддерживал, но если не поддерживает, то конвертация всё равно произойдёт, просто тел отобразит такие символы как квадратики или точки). НО! Если в тексте ресурса, который скармливаем моей функции находится хотя бы один символ, который закодирован НЕ В UTF-8, то функция возвращает пустую строку (можно исправить это, чтобы просто пропускала, например, такие символы, но я себе цель ставил просто побыстрее написать и затестить, будет ли работать).
beZ_probleM, твоя функция, как я понял, конвертирует из UTF-8 только узкий диапазон символов, в который входят русские буквы. А моя перекодирует полный диапазон всех символов (горжуся собой, гг). =)
Цитата:

а как передать не ресурс а сроку?
Сроки, тьфу ты, то есть сТроки в Java сразу принимают вид юникода. То есть если ты присвоишь строке что-то подобное:
Чувствуешь, кто-то нежно целует твои губы - это я нежно целую тебя перед сном. Спокойной ночи!
, то каждый из байтов примет вид юникода. Перекодировку нужно делать именно при чтении из ресурса или интернета, или файла из файловой системы. Но как запихуть в исходник, например, строку юникодную, в которой есть разные национальные символы - я сам не знаю. Точнее знаю, но вам этот способ не понравится. Например так (код на Java):
PHP код:

String s = (char)0x1040+(char)0x1041+(char)0x1042

Создастся строка из трёх символов UNICODE с соответствующими кодами. Целые тексты так набирать не очень удобно, поэтому, если кто-то знает, как в исходник скормить UNICODE, то объясните. На скорость и размер кода это никак не влияет, так как при компиляции любая заданная строка в конечном классе принимает вид юникода. Неважно, явно мы написали что-то вроде:
PHP код:

String s "Привет!!! =)"

или по кодам символов, как я написал выше.

Kurdt 17.10.2008 12:55

Re: Конвертирование кодировки utf для отображ&
 
я загружаю с интерента строку и у меня там вместо текста вот такие крякозяблы выдает
Чувствуешь, кто-то нежно С

тоесть автоматически не переводит, почему ? Может в начало строки нада чтото вставить?

Phantom 17.10.2008 13:45

Ответ: Конвертирование кодировки utf для отобра
 
Через мою функцию пропускаешь? Если нет, токрякозябры и будут.

Kurdt 17.10.2008 17:43

Re: Конвертирование кодировки utf для отображ&
 
Это 2 байтный уникод

ViNT 17.10.2008 22:55

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

Сообщение от Kurdt (Сообщение 89054)
Это 2 байтный уникод

Не обязательно, в инете кодировка может быть какая угодно (ISO, KOI, WIN-1251, UTF).

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 запросы обробатывать перед отправкой, и фообще в какой кодировке в телефоне тект который я в нем набираю

ViNT 28.03.2009 22:16

Ответ: Конвертирование кодировки utf для отобра
 
Телефон работает с кодировкой UTF-8

Ultimat 28.03.2009 22:24

Ответ: Конвертирование кодировки utf для отображ&#107
 
А почему в таком случае я отправляю в get запросе информацию введеную в форме телефона, на сайт приходят каракули?

Phantom 28.03.2009 22:42

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

Телефон работает с кодировкой UTF-8
Нет. Там Unicode. И я на предыдущей странице объяснял как из ЛЮБОГО потока правильно считать в строку UTF-8.

Ultimat 29.03.2009 01:39

Ответ: Конвертирование кодировки utf для отобра
 
Ты написал пример на ява три символа как переделать, а на мидлет паскале как быть? :)

Ultimat 29.03.2009 06:15

Ответ: Конвертирование кодировки utf для отобра
 
Я фиг знает :) повешаюсь скоро :) вроде бы элементарное русский текст отправить в интернет, а ни как, как же их опера мини, аська и другие приложения отправляют?

Phantom 29.03.2009 16:19

Ответ: Конвертирование кодировки utf для отобра
 
Когда строку отправляешь в поток, она автоматически перекодировывается в ASCII. В этой кодировке нет русских символов вообще. Тебе нужно строку в цикле посимвольно перекодировать обратно в ANSI. Алгоритм такой же, как при чтении, но всё наоборот. Или перекодировать в UTF-8. С этим сложнее. Немного.

Ultimat 29.03.2009 17:23

Ответ: Конвертирование кодировки utf для отобра
 
А почему до сих пор нет функции ни какой? Проблема то вобще простая :) я скоро застрелюсь.

Phantom 29.03.2009 18:10

Ответ: Конвертирование кодировки utf для отобра
 
Ну может на днях сделаю, если буде время и не будет лень :-D

Ultimat 29.03.2009 19:57

Ответ: Конвертирование кодировки utf для отобра
 
Буду намного благодарен а то я просто так не отстану :)

Trazzy 12.09.2009 08:00

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

как же их опера мини, аська и другие приложения отправляют?
Может это на сервере лежит пхп-файл обрабатывающий кодировки, а не cамо приложение?!

jkeks 24.12.2009 12:05

Ответ: Конвертирование кодировки utf для отобра&
 
В моем случае обычный UTF-8 показывается написанной тут функцией toUtf8code, данные читаю с инета, перекодирую этой функцией и показываю - все ок.

NightDeath 20.03.2010 00:46

Ответ: Конвертирование кодировки utf для отобра
 
У меня немного другая проблема по этой теме:если тхт не пересохранить в ворде,то при открытии его как ресурса мидлет повисает.Вопрос:в какой кодировке надо сохранять файл через блокнот,чтоб мидлет не повисал?

odd 20.03.2010 13:47

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

Сообщение от NightDeath (Сообщение 142391)
У меня немного другая проблема по этой теме:если тхт не пересохранить в ворде,то при открытии его как ресурса мидлет повисает.Вопрос:в какой кодировке надо сохранять файл через блокнот,чтоб мидлет не повисал?

Сохраняй в формате ANSI, а при чтении делай перекодировку Win1251 -> UTF-8

NightDeath 22.03.2010 01:58

Ответ: Конвертирование кодировки utf для отобра&
 
Не помогает,в кемуляторе в логе пишет аутофмемори.Неудобно каждый файл вордом пересохранять.Так у всех или тока у меня?

GRAY_WOLF 22.03.2010 08:56

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

Сообщение от NightDeath (Сообщение 142669)
Не помогает,в кемуляторе в логе пишет аутофмемори.Неудобно каждый файл вордом пересохранять.Так у всех или тока у меня?

А ты скажи что и код программы набираешь тоже в блокноте... На мой взгляд самый лучший это нотепад++ и подсветка синтаксиса есть (можно и код набирать) и с кодировкани проблем нет, сам им пользуясь.

NightDeath 29.03.2010 12:09

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

Сообщение от GRAY_WOLF (Сообщение 142687)
А ты скажи что и код программы набираешь тоже в блокноте... На мой взгляд самый лучший это нотепад++ и подсветка синтаксиса есть (можно и код набирать) и с кодировкани проблем нет, сам им пользуясь.

Через нотепад таже ошибка

odd 29.03.2010 20:47

Ответ: Конвертирование кодировки utf для отобра
 
Короче, это стандартная ошибка когда программа не может определить конец файла. Попробуй применить стандартный метод решения - в конце файла вставить строку типа "###" и читать строки так:
PHP код:

var 
    
stextstring
begin 
    repeat  
        s 
:= ReadLine(res); // Читаем строку из файла  
        
if s='###' then break; // Если конец файла, то прекращаем чтение  
        
text := text s// Что-то делаем co строкой 
    
until false;  
end


cherepets 29.03.2010 22:00

Ответ: Конвертирование кодировки utf для отобра
 
еще важный момент - после строки с меткой ("###") нужна еще 1 пустая строка

NightDeath 29.03.2010 22:37

Ответ: Конвертирование кодировки utf для отобра
 
Ну ### я и так пользовался,а вот насчет пустой строки,сейчас проверю


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

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