Главная страница
    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.53 MB
Время: 0.052 c
2-1169546929
Sventitskiy
2007-01-23 13:08
2007.02.11
Смена разделителя дробной части


2-1169626183
vajo
2007-01-24 11:09
2007.02.11
Как запустить проект ASP.NET Web Application for Delphi (BDS2006)


3-1163697525
Kolan
2006-11-16 20:18
2007.02.11
Как сделать чтобы программа подключалась к БД?


15-1168961336
isasa
2007-01-16 18:28
2007.02.11
Беспроводная сеть в офисе(обычные 100 Мбит/с).


2-1169640221
СержК
2007-01-24 15:03
2007.02.11
Как в одном Memo сделать разноцветные надписи





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский