Форум: "Прочее";
Текущий архив: 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