Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2014.09.14;
Скачать: [xml.tar.bz2];

Вниз

Разбираемся в кодировках   Найти похожие ветки 

 
Kerk ©   (2014-01-25 22:48) [40]


> И это... как дело обстоит в маке, иос и ведроде ?

Если верить моему беглому взгляду (мог что-то упустить), то на винде все по-старому, на андроиде используется библиотека ICU (поиск по имени функции ucnv_open вывел на http://site.icu-project.org/), на маке и айосе - iconv.


 
DevilDevil ©   (2014-01-25 23:00) [41]

> DVM ©   (25.01.14 22:32) [36]

> Фактически парсеру в таком случае надо понимать только где
> начинаются и где заканчиваются теги XML, а они как правило
> содержат символы которые что в UTF-8, что в Ansi имеют одни
> и те же коды и эти символы однобайтные. Т.е для простоты
> можно полагать, что парсер работает с текстом в котором
> все символы - однобайтные. Двух и более байтными могут быть
> только значения узлов или аттрибутов, разные там CDATA и
> пр, но их парсеру вовсе не надо перекодировать, он их может
> выдавать в том виде, в котором они были в исходных данных,
>  если это были данные в UTF-8 значит выдает UTF-8. Кому
> надо прекодирует значения нужных ему узлов и аттрибутов
> в ту кодировку, которая ему нужна. Исходная ведь известна.


Примерно так в конечном счёте и будет
Данные парсеру (и соответственно пользователю) поступают данные в кодировке Utf8 или Ansi (если все аттрибуты/узлы/etc) на латиннице.

А тип строки будет определён примерно так:
type
 XmlStringMode = (xsmDecoded, xsmUniversal, xsmEncoded);

 XmlString = packed record
   Data: pointer;
   Size: integer;

   case Integer of
     0: (Flags: integer);
     1: (CodePage: word; Mode: XmlStringMode; __: byte);
 end;


> Другое дело, если кодировка исходного документа, например,
>  Unicode и все символы имеют размер по 2 байта. Я так понимаю,
>  что ты собираешься перекодировать такие данные перед тем
> как передавать их парсеру? Так?


Сам парсер не будет знать, какой была исходная кодировка. Он лишь будет знать, в какой однобайтовой кодировке ему подают данные: в Utf8 или Ansi(CodePage)


 
DVM ©   (2014-01-25 23:10) [42]


> Данные парсеру (и соответственно пользователю) поступают
> данные в кодировке Utf8 или Ansi (если все аттрибуты/узлы/etc)
> на латиннице.

Ну так я об этом и говорил. Просто большинство парсеров что я видел, принудительно перекодируют все значения узлов, что для SAX не очень хорошо.


> Сам парсер не будет знать, какой была исходная кодировка.
>  Он лишь будет знать, в какой однобайтовой кодировке ему
> подают данные: в Utf8 или Ansi(CodePage)
>
>

Т.е где то будет перекодирование.


> А тип строки будет определён примерно так:

FreePascal будешь поддерживать? Там внимательнее с перечислениями надо, они там имеют не такой размер по умолчанию как в делфи.


 
DevilDevil ©   (2014-01-25 23:39) [43]

Офтоп:
Страшно читать чужие исходники где понаписали тысячу файлов :)


> ICONV

Насколько я понял, iconv тем плохо, что поддерживает значительно меньшее количество кодировок, чем виндусовый MultiByteToWideChar. Отсюда надо плясать. Получается количество поддерживаемых страниц ограничивается возможностями iconv. Или нет? ICU кстати всё поддерживает, что есть в iconv?

> Ну так я об этом и говорил. Просто большинство парсеров
> что я видел, принудительно перекодируют все значения узлов,
>  что для SAX не очень хорошо.


Ну они типа делают для удобства. Что конечно отрицательно сказывается на производительности.
Но меня больше веселит другое. Большинство парсингов, которые я видел, принимают на вход кодировку utf16. На мой взгляд абсолютно нелогичное решение. Во-первых, в большинстве случаев придётся весь файл перекодировать (в utf16), во-вторых, распознание символов происходит значительно медленнее. Вон в PugiXml используются компактные таблички на 256 элементов.


 
DevilDevil ©   (2014-01-25 23:40) [44]

> FreePascal будешь поддерживать? Там внимательнее с перечислениями
> надо, они там имеют не такой размер по умолчанию как в делфи.


Да, я с этим уже сталкивался
У меня уже есть шаблон, который я смело ставлю на каждый создаваемый юнит
// compiler options
{$ifdef fpc}
 {$mode delphi}
 {$asmmode intel}
{$endif}
{$V+}{$B-}{$X+}{$T+}{$P+}{$H+}{$J-}{$MINENUMSIZE 1}{$A4}
{$if CompilerVersion >= 15}
 {$WARN UNSAFE_CODE OFF}
 {$WARN UNSAFE_TYPE OFF}
 {$WARN UNSAFE_CAST OFF}
{$ifend}
{$O+}{$R-}{$I-}{$Q-}


 
DevilDevil ©   (2014-01-25 23:49) [45]

Скорее всего я найду в iconv... Но я хочу спросить у местных аксакалов, может знаете.

Вот допустим мы ставим перед собой задачу переконвертировать символ utf16 в символ ansi (windows-1251). И встречается нам какой нибудь французский "a" с загогулькой или немецкие амляуты. Непосредственно этого символа в windows-1251 нет. Но WideCharToMultiByte по идее найдёт "наиболее близкий символ".

Как выглядит этот алгоритм поиска "близкого символа" ?


 
clickmaker ©   (2014-01-25 23:55) [46]

> Как выглядит этот алгоритм поиска "близкого символа" ?

хэш-таблица?
символ с загогулькой -> символ без загогульки


 
DVM ©   (2014-01-26 00:12) [47]


> Насколько я понял, iconv тем плохо, что поддерживает значительно
> меньшее количество кодировок, чем виндусовый MultiByteToWideChar.
>

Это еще от системы зависит.


> Получается количество поддерживаемых страниц ограничивается
> возможностями iconv. Или нет? ICU кстати всё поддерживает,
>  что есть в iconv?

Недостающее всегда дописать можно.
А вот ICU многие не довольны. Много с ней нюансов говорят. Не java вариант, а тот который сишный.


 
DevilDevil ©   (2014-01-26 00:39) [48]

> хэш-таблица?
> символ с загогулькой -> символ без загогульки


хочешь сказать существует одна хеш-таблица по всем "загогулечным символам" utf16?


 
DevilDevil ©   (2014-01-26 16:35) [49]

Вобщем пока всё сводится к тому, чтобы писать отдельный модуль по конвертациям
Хочется подойти универсально, разбавив функционалом кодирования данных в формате XML (& и т.д.)


 
clickmaker ©   (2014-01-26 17:10) [50]

> одна хеш-таблица по всем "загогулечным символам" utf16?

не по всем. Для несуществующих юзается "default character"


 
DevilDevil ©   (2014-01-26 17:15) [51]

Покажи кодом


 
clickmaker ©   (2014-01-26 17:20) [52]

исходник WideCharToMultiByte?


 
DevilDevil ©   (2014-01-26 20:50) [53]

Типа того
от чего то же ты отталкиваешься. Подача уверенная... значит знаешь, о чём говоришь

Смотрю исходники iconv - там подход другой
Для каждой кодировки свой функция кодирования и декодирования символа
Со своими персональными таблицами, никаких хешей


 
clickmaker ©   (2014-01-26 21:20) [54]

> Со своими персональными таблицами

ну а кто ж спорит. Для каждой кодировки - своя таблица. Как именно в WideCharToMultiByte организован и оптимизирован поиск соответствий - это уж я не знаю, могу только предполагать


 
DevilDevil ©   (2014-01-29 00:23) [55]

Идём дальше

1) символы за диапазоном $ffff могут быть в верхнем/нижнем регистре или нет?
2) где в стандарте прописан полный список возможных XML-кодировок в атрибуте "encoding"?
3) такое понятие как кодовая страница(номер)... оно уникально для всех платформ или имеются различия?
4) какие ещё классификации кодировок существуют кроме Ansi и Unicode? Как например классифицировать китайский Big5 и прочие непонятности где размер символа не равен 1 байту

Все эти многочисленные непонятности порядком раздражают. Надеюсь хотя бы часть из них вы проясните


 
DevilDevil ©   (2014-01-29 11:07) [56]

Равнодушие хуже ненависти
Ребят, без вашей помощи мне не справиться никак :)


 
й   (2014-01-29 11:46) [57]

> Равнодушие хуже ненависти

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


 
clickmaker ©   (2014-01-29 12:03) [58]

> какие ещё классификации кодировок существуют кроме Ansi
> и Unicode?

их 3 всего. SBCS, DBCS и MBCS


 
DevilDevil ©   (2014-01-29 12:12) [59]

Я не жду волшебного пенделя
Я жду консультативной помощи того, кто с этими форматами и кодировками уже разбирался
Это минимум, который я ожидаю

Вариант, который бы меня устроил на 4 - это энтузиазм в поиске информации. Ибо цель благая, а задачи поиска информации и проектирования/реализации просто рвут меня на части. В идеале хочется заниматься только вторым.

Я вообще думаю у библиотеки неплохие перспективы войти в недра Delphi, как в свою очередь FastMM и прочие FastCode плюшки. Ибо в кодировках сейчас у них просто полный ахтунг, а особенно в классе TEncoding. Производительность - просто хочется плакать. Функционал тоже скудный. В итоге если твой софт должен работать с текстом - перспективы твои незавидные


 
DevilDevil ©   (2014-01-29 12:20) [60]

> clickmaker ©   (29.01.14 12:03) [58]
> их 3 всего. SBCS, DBCS и MBCS

Какие из представленных кодировок являются DBCS и MBCS?
http://www.gnu.org/software/libiconv/


 
clickmaker ©   (2014-01-29 12:30) [61]

> [60] DevilDevil ©   (29.01.14 12:20)

а сам-то как думаешь? Из буковок DB и MB не понятно?


 
DevilDevil ©   (2014-01-29 12:33) [62]

Я думаю ты не понял вопрос
Про размер примерно понятно
И я не спрашиваю про Unicode-кодировки

я спрашиваю про иные кодировки, обозначенные здесь
http://www.gnu.org/software/libiconv/


 
DVM ©   (2014-01-29 12:44) [63]


> DevilDevil ©   (29.01.14 12:33) [62]


> я спрашиваю про иные кодировки, обозначенные здесь

Гуглишь название каждой, читаешь описание. Мне не понятен вопрос. Там сотня кодировок, по каждой надо написать сюда какие из них мультибайтный, какие однобайтные и т.д.?


 
DVM ©   (2014-01-29 12:46) [64]


> DevilDevil ©   (29.01.14 12:12) [59]


> Я вообще думаю у библиотеки неплохие перспективы войти в
> недра Delphi, как в свою очередь FastMM и прочие FastCode
> плюшки. Ибо в кодировках сейчас у них просто полный ахтунг,
>  а особенно в классе TEncoding. Производительность - просто
> хочется плакать. Функционал тоже скудный. В итоге если твой
> софт должен работать с текстом - перспективы твои незавидные

Состояние класса TEncoding нормальное и соответствующее нынешним реалиям. Если ты возьмешь аналогичный класс из NET то там функционал примерно такой же и список поддерживаемых кодировок тоже. Реализованы популярные кодировки.


 
DevilDevil ©   (2014-01-29 13:05) [65]

> Гуглишь название каждой, читаешь описание. Мне не понятен
> вопрос. Там сотня кодировок, по каждой надо написать сюда
> какие из них мультибайтный, какие однобайтные и т.д.?


Во-первых, не сотня
Во-вторых, большинство однобайтные
В-третьих, юникодовые не касаемся

Получается под категорию DBCS и MBCS попадает всего несколько (классов) кодировок. Я хочу знать какие
Кроме того по идее кто сталкивался с DBCS и MBCS - может прояснить ситуацию.

> Состояние класса TEncoding нормальное и соответствующее
> нынешним реалиям. Если ты возьмешь аналогичный класс из
> NET то там функционал примерно такой же и список поддерживаемых
> кодировок тоже. Реализованы популярные кодировки.


А я и не сказал, что отвратительное. Если ты работаешь только с UnicodeString и файлами до 1Мб - то функционала вполне может хватить. Но копни глубже, до уровня например UTF32 - и всё. Увеличь размер до 100Мб Utf8 - и всё. Поставь задачу реализовать частично функционал Notepad++ - и всё. Захотел распознать encoding в XML-документе - и всё.

Я не говорю, что отвратительно. Я говорю, что можно и нужно значительно лучше


 
DVM ©   (2014-01-29 13:27) [66]


> DevilDevil ©   (29.01.14 13:05) [65]


> Во-первых, не сотня

Даже больше, посчитай сам.


> В-третьих, юникодовые не касаемся

А юникодная не может быть DBCS ?


> Получается под категорию DBCS и MBCS попадает всего несколько
> (классов) кодировок. Я хочу знать какие
> Кроме того по идее кто сталкивался с DBCS и MBCS - может
> прояснить ситуацию.

Да все сталкивались, но сталкивались с конкретными, а не со всеми сразу.


> Если ты работаешь только с UnicodeString и файлами до 1Мб
> - то функционала вполне может хватить. Но копни глубже,
> до уровня например UTF32 - и всё. Увеличь размер до 100Мб
> Utf8 - и всё.

Опять ты хочешь сделать серебрянную пулю на все случаи жизни. Тебе дан механизм, делай расширение по образцу, используй готовые примитивы.
Сделать свои классы кодировок по аналогии с TEncoding и зарегистрировать - не проблема, размер файла - читай поблочно и декодируй  - тоже не проблема. Notepad++ тоже ведь сделан не на базе какого то супер-пупер готового и волшебного компонента, кто-то же это запрограммировал. Кому надо запрограммирует и в своем коде.


 
DevilDevil ©   (2014-01-29 14:27) [67]

124 :)

> А юникодная не может быть DBCS ?
может
просто с ними всё понятно

> Опять ты хочешь сделать серебрянную пулю на все случаи жизни.
>  Тебе дан механизм, делай расширение по образцу, используй
> готовые примитивы.
> Сделать свои классы кодировок по аналогии с TEncoding и
> зарегистрировать - не проблема, размер файла - читай поблочно
> и декодируй  - тоже не проблема. Notepad++ тоже ведь сделан
> не на базе какого то супер-пупер готового и волшебного компонента,
>  кто-то же это запрограммировал. Кому надо запрограммирует
> и в своем коде.


Программист тем хорош, что может спроектировать и реализовать быстрое удобное универсальное решение
Конечно нужно прикидывать какую ценность будет иметь то или иное вложение. Но это не значит, что данное направление нет необходимости проработать.

На данном этапе я собираю информацию. И я прошу помочь хотя бы с ней
В [55] я же не только про SBCS/DBCS/MBCS спросил. Но это тоже информация и я за неё благодарен


 
clickmaker ©   (2014-01-29 14:47) [68]

> быстрое удобное универсальное

выберите любые 2


 
DevilDevil ©   (2014-01-29 15:06) [69]

я выжму 2.5
вопрос только от чего эти 0.5 отнимутся
я думаю 0.05 от "быстрое", 0.05 от "удобное" и 0.4 от "универсальное"


 
DevilDevil ©   (2014-01-30 15:54) [70]

Не могу понять, где под не-Windows заполняется DefaultSystemCodePage
В Windows понятно - GetACP()
А как в других ОС?


 
DevilDevil ©   (2014-01-30 16:30) [71]

И ещё вопрос по class helper
Вот есть класс TEncoding
У него есть метод:
class function GetBufferEncoding(const Buffer: TBytes; var AEncoding: TEncoding;
     ADefaultEncoding: TEncoding): Integer; overload; static;


Средствами class helper я могу "перехватить" (переопределить) эту функцию или нет?


 
Kerk ©   (2014-01-30 16:35) [72]

С помощью RTTI можешь


 
DevilDevil ©   (2014-01-30 16:39) [73]

Предчувствую я, ты говоришь о хаке, который не рекомендуется к использованию
Слушаю как


 
Kerk ©   (2014-01-30 16:43) [74]


> Слушаю как

http://docwiki.embarcadero.com/Libraries/XE5/en/System.Rtti.TVirtualMethodInterceptor
Появилось в Delphi XE


 
DevilDevil ©   (2014-01-30 16:45) [75]

Во-первых, ты не сказал, как пользовать
Во-вторых, метод то не виртуальный


 
Kerk ©   (2014-01-30 16:50) [76]


> Во-первых, ты не сказал, как пользовать

Я могу конечно текст справки и код примера сюда скопировать, но смысл?

> Во-вторых, метод то не виртуальный

Это я проглядел, да. Не тот случай. Тогда без грязных хаков никак, думаю.


 
DevilDevil ©   (2014-01-30 16:53) [77]

я жмакаю по "Code Examples" - чёт он меня никуда не перенаправляет
офтоп: мда, первый раз когда я пользуюсь хелпером - заставляет меня чуть-чуть в нём разочароваться :)

Ok.
Возвращаемся к другому вопросу
Как определяется DefaultSystemCodePage в не-Windows системах?


 
Kerk ©   (2014-01-30 16:57) [78]


> я жмакаю по "Code Examples" - чёт он меня никуда не перенаправляет

Вот тут примерно то же самое
http://blog.barrkel.com/2010/09/virtual-method-interception.html


 
DevilDevil ©   (2014-01-30 17:02) [79]

> DVM ©   (29.01.14 13:27) [66]
> Сделать свои классы кодировок по аналогии с TEncoding и
> зарегистрировать - не проблема


Кстати забавный этот TEncoding
С одной стороны действительно много вещей продумали. И SingleByte, и MBCS, а в strict private уже объявлены:
   class var
     FANSIEncoding: TEncoding;
     FASCIIEncoding: TEncoding;
     FBigEndianUnicodeEncoding: TEncoding;
     FUnicodeEncoding: TEncoding;
     FUTF7Encoding: TEncoding;
     FUTF8Encoding: TEncoding;
   class function GetANSI: TEncoding; static;
   class function GetASCII: TEncoding; static;
   class function GetBigEndianUnicode: TEncoding; static;
   class function GetDefault: TEncoding; static; inline;
   class function GetUnicode: TEncoding; static;
   class function GetUTF7: TEncoding; static;
   class function GetUTF8: TEncoding; static;


Но вот беда
Код GetBufferEncoding заточен только на UTF8, UCS2 и UCSbe
И функционала как "зарегистрировать" кодировку - просто нет


 
DevilDevil ©   (2014-01-30 17:03) [80]

> Вот тут примерно то же самое
> http://blog.barrkel.com/2010/09/virtual-method-interception.html


понятно



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

Форум: "Прочее";
Текущий архив: 2014.09.14;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.64 MB
Время: 0.005 c
2-1381983486
i2e
2013-10-17 08:18
2014.09.14
Shift = [ssCtrl]; А если нажато несколько?


15-1390565775
DevilDevil
2014-01-24 16:16
2014.09.14
Разбираемся в кодировках


15-1391632202
Юрий
2014-02-06 00:30
2014.09.14
С днем рождения ! 6 февраля 2014 четверг


15-1391648324
ProgRAMmer Dimonych
2014-02-06 04:58
2014.09.14
MSIExec капризничает


2-1381834603
v1.0
2013-10-15 14:56
2014.09.14
множество





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский