Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.11;
Скачать: CL | DM;

Вниз

Unicode -> cp1251   Найти похожие ветки 

 
georgius ©   (2006-12-18 18:40) [0]

Появилась срочная необходимость конвертировать юникод обратно в кириллицу. Строки содержат русский и латинский текст и ... псевдографику, так что легких путей нет.
WideCharToMultiByte возвращает какую-то муть, даже длина строки не соответствует исходной.


 
Anatoly Podgoretsky ©   (2006-12-18 18:43) [1]

> georgius  (18.12.2006 18:40:00)  [0]

Это тяжелых нет, а легкий путь как раз WideCharToMultiByte


 
Джо ©   (2006-12-19 04:23) [2]

Юникод он, как бы это сказать, разный бывает.


 
Anatoly Podgoretsky ©   (2006-12-19 09:47) [3]

> Джо  (19.12.2006 4:23:02)  [2]

Но в Виндоус то используется один.


 
Джо ©   (2006-12-19 15:43) [4]

> [3] Anatoly Podgoretsky ©   (19.12.06 09:47)
> > Джо  (19.12.2006 4:23:02)  [2]
>
> Но в Виндоус то используется один.

Мало ли откуда в его программе эти строки берутся. Может, из сети, может, из сообщений SMS, а может и из деревни от дедушки.


 
Anatoly Podgoretsky ©   (2006-12-19 15:46) [5]

> Джо  (19.12.2006 15:43:04)  [4]

Я вообще то за все время видел только UCS2, а про UCS4 только слышал, а других Юникодов не существует


 
tesseract ©   (2006-12-19 15:49) [6]

А просто String:=WideString? должна сработать конвертация.


> WideCharToMultiByte возвращает какую-то муть, даже длина
> строки не соответствует исходной.


И не должна. Функцию надо раз вызвать c nil в качестве получаетля, для того чтобы определить количество памяти под строку.


 
Anatoly Podgoretsky ©   (2006-12-19 16:01) [7]

> tesseract  (19.12.2006 15:49:06)  [6]

1. возможно, если повезет
2. 0 за nil отругает, если конечная кодировка OEM/ANSI то длина заранее известна


 
Джо ©   (2006-12-19 16:05) [8]

> [5] Anatoly Podgoretsky ©   (19.12.06 15:46)
> > Джо  (19.12.2006 15:43:04)  [4]
>
> Я вообще то за все время видел только UCS2, а про UCS4 только
> слышал, а других Юникодов не существует

Кроме UCS2 (AKA UTF-16), есть еще UTF-8 и даже UTF-7. Кроме того, строка может быть предварена маркером порядка байтов (FF FE или FE FF), а может и нет. И т.д., и т.п. В общем, кодировок, основанных на UNICODE — как собак нерезанных :)


 
Anatoly Podgoretsky ©   (2006-12-19 16:13) [9]

> Джо  (19.12.2006 16:05:08)  [8]

> UTF-8 и даже UTF-7

Это не кодировка, а транспортная упаковка того же Юникод, это все равно, что сказать, что Base64/QP/PlainText/Mime это кодировка.


 
Джо ©   (2006-12-19 16:19) [10]

> [9] Anatoly Podgoretsky ©   (19.12.06 16:13)
> > Джо  (19.12.2006 16:05:08)  [8]
>
> > UTF-8 и даже UTF-7
>
> Это не кодировка, а транспортная упаковка того же Юникод,
> это все равно, что сказать, что Base64/QP/PlainText/Mime
> это кодировка.

Нет, терминологически, UTF-8, UTF-7, CESU-8 и т.д — это именно "encodings", т.е., «кодировки».


 
tesseract ©   (2006-12-19 16:23) [11]


> Anatoly Podgoretsky ©   (19.12.06 16:01) [7]


Мне в Turbo Delphi почему-то постоянно везёт :-)


 
Anatoly Podgoretsky ©   (2006-12-19 16:25) [12]

> Джо  (19.12.2006 16:19:10)  [10]

а кодировка это не encodings, а code page


 
Anatoly Podgoretsky ©   (2006-12-19 16:26) [13]

> tesseract  (19.12.2006 16:23:11)  [11]

Надеюсь, ты про размер говорил, а не про буфер?


 
Джо ©   (2006-12-19 16:27) [14]

> [12] Anatoly Podgoretsky ©   (19.12.06 16:25)
> > Джо  (19.12.2006 16:19:10)  [10]
>
> а кодировка это не encodings, а code page

Code page — это «кодовая страница». В Юникоде вообще это понятие упразднено за ненужностью.


 
Anatoly Podgoretsky ©   (2006-12-19 16:29) [15]

> Джо  (19.12.2006 16:27:14)  [14]

Поэтому только всего два Юникода - ucs2 aka Unicode16 и ucs4 aka Unicode32
Нету у Юникод кодировок, в отличии от ASCII/ANSI


 
tesseract ©   (2006-12-19 16:30) [16]


> Anatoly Podgoretsky ©   (19.12.06 16:26) [13]


про string:=WideString и наоборот :-)


 
Anatoly Podgoretsky ©   (2006-12-19 16:34) [17]

> tesseract  (19.12.2006 16:30:16)  [16]

Работает, но ограничено, если повезет, что ACP правильный и Юникод содержит символы только данного ACP то все отработает как требуется без всякой магии и дополнительного кода. Но это если повезет, вот мне обычно не везет.


 
Джо ©   (2006-12-19 16:36) [18]

> [15] Anatoly Podgoretsky ©   (19.12.06 16:29)
> > Джо  (19.12.2006 16:27:14)  [14]
>
> Поэтому только всего два Юникода - ucs2 aka Unicode16 и
> ucs4 aka Unicode32
> Нету у Юникод кодировок, в отличии от ASCII/ANSI

Отчего же «поэтому»?
Я как раз понимаю так, что Юникод, собственно говоря, это просто большая таблица кодовых позиций. А как они будут записаны — это уже вопрос конкретной кодировки (encoding). Понятие code page вообще к Юникоду неприменимо в принципе, это совсем из другой оперы.


 
Anatoly Podgoretsky ©   (2006-12-19 16:39) [19]

> Джо  (19.12.2006 16:36:18)  [18]

Я не говорю что применимо, Юникод это всего одна кодировка, в отличии от прочего.


 
Джо ©   (2006-12-19 16:43) [20]

Ну, это вопрос перевода терминологии на русский язык.
Тем не менее, как бы мы не называли способ записи, «кодировкой» или нет, если не знать этот способ, то интерпретировать строку нельзя. А способов записи — множество.


 
Anatoly Podgoretsky ©   (2006-12-19 16:46) [21]

> Джо  (19.12.2006 16:43:20)  [20]

Не играет роли, Юникод один, пока, потом может и второй получит распространение.
С этим Юникодом и Микрософтом вообще смешная вещь.


 
Джо ©   (2006-12-19 17:02) [22]

Кстати, предлагаю разрулить терминологическую неточность (двусмысленность). Каким образом следует переводить выражание "Unicode encodings"?


 
Anatoly Podgoretsky ©   (2006-12-19 17:12) [23]

> Джо  (19.12.2006 17:02:22)  [22]

Я бы не стал переводить, во первых там много мути намутили, во вторых в отрыве от контекста. Сообственно мне перевод, думаю и тебе, не требуется, мы всегда знаем о чем в том или другом случае идет речь.
Но если предположить, что речь именно об Юникод, то можно перевести как масло масляное. Подчеркивают, что для кодирования символов используется Юникод.


 
umbra ©   (2006-12-19 18:10) [24]

Джо ©   (19.12.06 17:02) [22]

в контексте обсуждения это больше всего похоже на "кодировка для передачи", поскольку, хотя набор кодов символов один (уникод), из-за различия в кол-ве байт на символ, транспортные кодировки (нужные, в теории, для уменьшения объема передаваемых данных) могут быть разными (упомянутые UTF-8, UTF-7). И хотя коды символов при этом одинаковы, но, чтобы восстановить текст, все равно надо знать способ кодирования, примененный при передаче.


 
Джо ©   (2006-12-19 18:17) [25]

Ну, они не только для «уменьшения объема передаваемых данных» служат. UCS-4, например, явно избыточна во многих случаях и употребляется для того, чтобы кол-во байт для любой кодовой позиции было одинаковым.


 
umbra ©   (2006-12-19 18:27) [26]

ну, UCS-4 в данный исторический период нужна только каким-то суперэкзотическим языкам или наборам неязыковых символов. Я так понимаю, что это Уникод, версия 2. Т.е. это не "кодировка для передачи", а, пока что ненужный, стандарт.


 
Anatoly Podgoretsky ©   (2006-12-19 19:33) [27]

> umbra  (19.12.2006 18:27:26)  [26]

2 или 4 значит количество байт


 
Anatoly Podgoretsky ©   (2006-12-19 19:40) [28]

> umbra  (19.12.2006 18:10:24)  [24]

> (нужные, в теории, для уменьшения объема передаваемых данных)

В теории не так, во первых при передаче с помощью UTF объем увеличивается, а нужны транспортные "кодировки" для прохождения через транспортный канал. UTF-7 использует семибитные символы, а UTF-8 восьмибитные соответственно.  В итоге в упакованом виде в них отсутствуют непечатные символы, не совместимые с транспортным каналом, особенно опасен байт со значением 0, а для западноевропейских это каждый второй байт. Не лучше дело обстоит и с другими языками, для кирилицы это байт 04, есть и другие которые не совместимы с каналом, особенно с американским 7 битным, такие сервера еще остались.


 
umbra ©   (2006-12-19 19:52) [29]


> 2 или 4 значит количество байт
>

я в курсе :)


> во первых при передаче с помощью UTF объем увеличивается

насколько я знаю, UTF-7 сделана специально для передачи по каналам связи, а Utf-8 - чтобы использовать два байта на символ только когда это необходимо. И, согласитесь, они все таки сокращают размер передаваемых данных (если считать, что в основном используются символы с кодами размером в байт) убирая те самые нули


 
Anatoly Podgoretsky ©   (2006-12-19 19:59) [30]

> umbra  (19.12.2006 19:52:29)  [29]

7 или 8 означает количество бит!


 
umbra ©   (2006-12-19 20:04) [31]

2 Anatoly Podgoretsky ©   (19.12.06 19:59) [30]

у меня такое впечатление, что это намек, но моих способностей не хватает, чтобы им воспользоваться.


 
Anatoly Podgoretsky ©   (2006-12-19 20:39) [32]

> umbra  (19.12.2006 20:04:31)  [31]

Намек, намек


 
Zeqfreed ©   (2006-12-19 22:31) [33]

> umbra ©   (19.12.06 19:52) [29]

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

UTF-8 ни для какого диапазона символов не сокращает размер передаваемых данных. Для русского языка, например, в этой кодировке будут использованы 2 байта на символ, а для символов китайского - все четыре. Размер данных сохраняется только для символов из стандартного набора ANSI символов.



Страницы: 1 вся ветка

Текущий архив: 2007.02.11;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.034 c
2-1169473359
FIL-23
2007-01-22 16:42
2007.02.11
Белый шум


2-1169396785
md
2007-01-21 19:26
2007.02.11
динамический массив


6-1156746436
vodvorezlaya
2006-08-28 10:27
2007.02.11
Создание собственного Proxy сервера


3-1164029298
Ольга
2006-11-20 16:28
2007.02.11
Ошибка I/O Error 103 при работе с базой данных Paradox


15-1169340589
IMHO
2007-01-21 03:49
2007.02.11
Модель распространения ПО