Здравствуйте, alsemm, Вы писали:
A>>>В ICU есть два комплекта функций tolower/toupper:
К>>Но с немецким эсцетом ни одна из них не справится (наверно?) A>Это когда, например, буква 'A' с кружком наверху представляется двумя символами? Думаю ICU-ые фнкции, которые конвертируют строки целиком, а не отдельные символы справятся.
Не, это такая хрень которая маленькая выглядит как греческая бета, а большая — как SS. хз как ее ловеркейзить, насколько я понимаю, не любая SS является эсцетом.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, Sergey, Вы писали:
S>Здравствуйте, alsemm, Вы писали:
A>>>>В ICU есть два комплекта функций tolower/toupper:
К>>>Но с немецким эсцетом ни одна из них не справится (наверно?) A>>Это когда, например, буква 'A' с кружком наверху представляется двумя символами? Думаю ICU-ые фнкции, которые конвертируют строки целиком, а не отдельные символы справятся.
S>Не, это такая хрень которая маленькая выглядит как греческая бета, а большая — как SS. хз как ее ловеркейзить, насколько я понимаю, не любая SS является эсцетом. http://unicode.org/reports/tr21/tr21-5.html — спецификация unicode case mapping. http://unicode.org/reports/tr21/tr21-5.html#Introduction — в качестве вступления описаны эти самые SS и турецкая i, чтобы читатель оценил масштаб бедствия
Думаю ICU все это умеет, ибо http://www.unicodeconference.com/bios.htm:
Mark Davis
Sr. Internationalization Architect, Google Inc.
Dr. Mark Davis co-founded the Unicode project and has been the president of the Unicode Consortium since its incorporation in 1991. He is one of the key technical contributors to the Unicode specifications.
Mark founded and was responsible for the overall architecture of ICU (the premier Unicode software internationalization library), and architected the core of the Java internationalization classes. He also founded and is the chair of the Unicode CLDR project, and is a co-author of BCP 47 "Tags for Identifying Languages" (RFC 4646 and RFC 4646), used for identifying languages in all XML and HTML documents.
Since the start of 2006, Mark has been working on software internationalization at Google, focusing on effective and secure use of Unicode (especially in the index and search pipeline), the software internationalization libraries (including ICU), and stable international identifiers.
Здравствуйте, alsemm, Вы писали:
S>>...один комплект простой и работает неправильно, а второй — как в CRT A>CRT-ая tolower конвертирует символ, а не строку. Так что всякие извращенные случаи, когда один заглавный символ превращается в несколько/0 прописных она обработать корректно не может.
С турецким проблема другая — без локали фиг догадаешься, что I должно конвертироваться в ı а не в i.
A>Аргумент CRT-ой tolower — символ юникода, но он обязательно должен быть из текущей локали http://opengroup.org/onlinepubs/007908799/xsh/towlower.html: A>
A>The towlower() function has as a domain a type wint_t, the value of which must be a character representable as a wchar_t, and must be a wide-character code corresponding to a valid character in the current locale or the value of WEOF
A>Из этого следует, что если нужно конвертировать произвольную unicode строку, то перед вызовом towlower() для каждого символа строки надо определить какой он принадлежит локали (CRT для этого средств не предоставляет) и переключиться, если нужно. Однако, если даже правильно переключать локали результат будет не всегда корректным, т.к. towlower() не учитвает контекст символа.
A>Да, чуть не забыл, в случае, если sizeof(wchar_t) = 2 и кодировка не UCS2, а UTF16, т.е. надо иметь дело с surrogate pairs — towlower() вообще бесполезен.
A>И что такое CRT-ая towlower(), если не УГ после этого?
Да что вы все о towlower да о towlower, в CRT есть же в конце концов и _wcslwr. Которой для полного счастья только длины буфера не хватает.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Здравствуйте, alsemm, Вы писали:
К>>Но с немецким эсцетом ни одна из них не справится (наверно?) A>Это когда, например, буква 'A' с кружком наверху представляется двумя символами? Думаю ICU-ые фнкции, которые конвертируют строки целиком, а не отдельные символы справятся.
Эсцет — это буква, похожая на бету — на самом деле, лигатура готических строчных sz / ss. В заглавном виде не существовала (сейчас, вроде бы, есть подвижка сделать её и заглавной тоже). Соответственно, честный toupper — это не одиночный символ, а двойной: SS (или SZ в зависимости от контекста?)
Здравствуйте, Кодт, Вы писали:
К>Здравствуйте, alsemm, Вы писали:
К>>>Но с немецким эсцетом ни одна из них не справится (наверно?) A>>Это когда, например, буква 'A' с кружком наверху представляется двумя символами? Думаю ICU-ые фнкции, которые конвертируют строки целиком, а не отдельные символы справятся.
К>Эсцет — это буква, похожая на бету — на самом деле, лигатура готических строчных sz / ss. В заглавном виде не существовала (сейчас, вроде бы, есть подвижка сделать её и заглавной тоже). Соответственно, честный toupper — это не одиночный символ, а двойной: SS (или SZ в зависимости от контекста?) Та которая строки, а не отдельные символы конвертирует должна справиться
Здравствуйте, pepsicoca, Вы писали:
P> Зачем еще указывать локаль?
Потому что файловые потоки (точнее, их буфера) в С++ принудительно конвертируют строки в ANSI по текущей кодовой страницей локали, а вывод в консоль в VC сделан именно через них. А из-за разницы между текущей кодовой страницей потока (к примеру, 1251) и кодовой страницей консоли (866) получаем означенную проблему.
Здравствуйте, Кодт, Вы писали:
К>Нужно знать локаль выходного файлового потока. Он-то байтовый.
Кстати, а почему так сделано. Вопрос не про fstream, а про wfstream.
Для портируемости? Сомневаюсь, что её можно достигнуть, оперируя у себя на машине юникодом и сохраняя его в ANSI кодировке на основании текущей локали. Ведь информация о последней не содержится в файле. Почему бы не сделать сохранение wfstream'a в файл в юникоде? Или ноги растут от того, что wchar_t в С++ — это не юникод, а просто wide character (и изначально в старых компиляторах он был простым typedef'ом от unsigned short)?
В новый стандарт добавили "истинно юникодовые" символы — char16_t & char32_t (UTF16/32), вот только ситуация с потоками осталась прежней.
В VC8 добавили, кстати, возможность сохранения данных в файл в юникоде — через суффикс имени файла "cch=encoding". Костыль, конечно, но хоть как-то теперь работает.
Здравствуйте, byleas, Вы писали:
К>>Нужно знать локаль выходного файлового потока. Он-то байтовый. B>Кстати, а почему так сделано. Вопрос не про fstream, а про wfstream.
B>Для портируемости?
Именно.
B>Сомневаюсь, что её можно достигнуть, оперируя у себя на машине юникодом и сохраняя его в ANSI кодировке на основании текущей локали. Ведь информация о последней не содержится в файле.
А это уже не из стандарта, а (странная) особенность реализации.
B>Почему бы не сделать сохранение wfstream'a в файл в юникоде?
В какой формат будем сохранять — UTF-16 BE или UTF-16 LE? А если мне в другой надо? А с текущим положением дел, я могу написать свой codecvt, который складывает байты в том порядке, в котором мне надо. Так что не надо нам таких усовершенствований, у меня из-за них программа перестанет работать.
B> Или ноги растут от того, что wchar_t в С++ — это не юникод, а просто wide character (и изначально в старых компиляторах он был простым typedef'ом от unsigned short)?
B>В новый стандарт добавили "истинно юникодовые" символы — char16_t & char32_t (UTF16/32), вот только ситуация с потоками осталась прежней.
B>В VC8 добавили, кстати, возможность сохранения данных в файл в юникоде — через суффикс имени файла "cch=encoding". Костыль, конечно, но хоть как-то теперь работает.
Копипастишь к себе codecvt_null из boost/archive — и работает везде. При необходимости фиксишь порядок байт как требуется.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.