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

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.66 MB
Время: 0.015 c
15-1392064202
Юрий
2014-02-11 00:30
2014.09.14
С днем рождения ! 11 февраля 2014 вторник


15-1392150605
Юрий
2014-02-12 00:30
2014.09.14
С днем рождения ! 12 февраля 2014 среда


15-1391758562
АндрейК
2014-02-07 11:36
2014.09.14
DelphiX


11-1254087305
intlex
2009-09-28 01:35
2014.09.14
Creation Order (Порядок создания компонентов)


2-1381983486
i2e
2013-10-17 08:18
2014.09.14
Shift = [ssCtrl]; А если нажато несколько?