Нашли или выдавили из себя код, который нельзя назвать нормальным,
на который без улыбки не взглянешь?
Не торопитесь его удалять или рефакторить, — запостите его на
говнокод.ру, посмеёмся вместе!
С toupper беда: по умолчанию она переводит в заглавные только ASCII, т. е. только базовую латиницу. Для перевода букв других алфавитов нужна локализованная версия функции, которая на вход принимает ещё и кодировку.
Для UTF-8 есть mbctoupper, а для UTF-16/UCS-2 (кто знает точно, для какой из них?) — towupper. Но здесь, как я понимаю, кодировка однобайтная. Значит, либо придётся либо использовать API операционной системы (в Windows уже упомянутую CharUpper, которая в качестве параметра кодировку не принимает, поэтому её результат зависит от локали, установленной у клиента) либо тащить с собой дополнительную библиотеку (iconv или типа того).
В любом случае даже приведённый код можно было сократить в два раза с помощью toupper.
Россия и Турция - это единственные страны, достаточно близкие что бы быть кастомерами, где что-то менялось за после *пять* лет.
я не то что бы сильно слежу за темой - может еще чего и пропустил - просто время от времени в виндовые апдейты поглядываю.
> но часовые пояса обсудить нужно.
меняют часто только те страны для которых это больших проблем не создаёт.
большие страны - таже Россия - часто этого делать не будет потому что слишком большой эффект у изменения. и как правило самые подверженые "временным" проблемам системы - это финансовые, т.к. все повально всё ещё в местном времени ведут учёт переводов и платежей.
К сожалению:
- в винде и в линухе совершенно разные названия локалей;
- 'б' не всегда помещается в char;
- std::toupper() бесполезен для multibyte кодировок.
какие мультибайт кодировки, вы исходный пост читали?
- для альтернативных ОС мультибайт надо переводить в вайд, т.к. врядли только апперкейсом ограничится
- std::toupper(std::locale) работает в т.ч. и с вайд
- перевод utf8<->вайд есть в самом с++11 уже (т.к. слямзили с буста)
Немцы со своим SS в любой кодировке сосут, потому что в нижний регистр оно может преобразовываться как ss или как ß, в зависимости от слова. Тут без словаря вообще не преобразуешь.
И наоборот, насчёт того, преобразовывать ß в SS или оставить, как есть, единого мнения нет.
Кстати, не все редакции журналов признали реформу 1996 года, в результате которой появилось сочетание SSS и пришлось соснуть ещё раз.
То есть то, что ß однозначно заменили на ss - неверно? Чорт, вот как так можно ухитриться насрать себе в кашу в конце 20 века, когда все связанные с этим компьютерные проблемы уже видны?
В слове «масштаб», например, и в других многоосновных. Правда, если верить викисловарю, в Германии именно это слово оставили: https://de.wiktionary.org/wiki/Maßstab. НО ЕСЛИ ПИСАТЬ КАПСОМ, ТО ТРЕБУЮТСЯ ТРИ БУКВЫ S ПОДРЯД. А швейцарцы и без капса пишут с тремя одинаковыми буквами подряд.
P.S. В названиях улиц есть. Paßstraße после реформы 1996 называется Passstraße.
> когда все связанные с этим компьютерные проблемы уже видны
Когда в ходу была КОИ-7, компьютерные проблемы вызывали даже строчные буквы, ПОЭТОМУ ВСЕ ПИСАЛИ КАПСОМ. И ЭТО НЕ СЧИТАЛОСЬ ЭКСПРЕССИВНО ОКРАШЕННОЙ РЕЧЬЮ. ЗАТО СКОЛЬКО БАЙТ ЭКОНОМИЛОСЬ; ШИФТ ПЕРЕКЛЮЧАЛ С КИРИЛЛИЦЫ НА ЛАТИНИЦУ, А НЕ СО СТРОЧНЫХ НА ЗАГЛАВНЫЕ. КРАСОТА!
К чему это я? Компьютерные проблемы — временные. Если в 90-х винчестер на гигабайт был пределом мечтаний, то сейчас у обычного школьника в мобильном телефоне карта памяти больше.
*****
Средство для розжига: в турецком языке есть буквы İ («и» заглавная с точкой) и ı («и» строчная без точки). Из-за этой мелочи таблица соответствия заглавных строчным не соответствует европейской. Домашнее задание: предложите реформу турецкой орфографии, чтобы устранить компьютерную проблему.
> предложите реформу турецкой орфографии, чтобы устранить компьютерную проблему.
Да выпилить к чертям ненужную букву!
Вот у украинцев зачем-то три буквы "и" и две буквы "е", если не ошибаюсь. Зачем они? Выпилить, как в русском выпилили лишние буквы.
У нас йэщо остались как минимум буквы тсэ, йэ, йо, йу, йа, которыйэ можно спокойно выпилить. Ну или выпилить э, а йэ оставить. Йэщо мошно выпилить букву, на которуйу начинайэтсьа слово "шопа". Тоше не очэнь нушная буква, всьо равно йэйо мошно спутать с буквой "ш", а так искусствьэнная гранитса будьэт размыта.
PS: esli postoratsia mogno reshit vse problemi translitom na zakonodatelnom urovne - i vikinut nahui unicod na pomoyku istorii.
doloy inertsiu mishlenia!
Хе-хе. Работал я, в общем, в госструктуре одной, обрабатывали мы правовые акты. И вот таки i латинское и i белорусское (палюсь) - две разные юникод-сущности. А в исходных текстах было то так, то сяк. Ну, нормировали к одной какой-то букве при индексации для поиска.. а вот если еще и латинские термины или формулы какие в документах - наверное индексатор наиндексирует хуйню.
Для UTF-8 есть mbctoupper, а для UTF-16/UCS-2 (кто знает точно, для какой из них?) — towupper. Но здесь, как я понимаю, кодировка однобайтная. Значит, либо придётся либо использовать API операционной системы (в Windows уже упомянутую CharUpper, которая в качестве параметра кодировку не принимает, поэтому её результат зависит от локали, установленной у клиента) либо тащить с собой дополнительную библиотеку (iconv или типа того).
В любом случае даже приведённый код можно было сократить в два раза с помощью toupper.
P.S. Это замечание к данному коду не относится, просто наболело.
если у тебя нет кастомеров на каких Фиджи, и если ты не грандиозный педант, то обновлять можно и раз в 2-3 года.
история виндовых апдейтов:
https://support.microsoft.com/en-us/kb/2981580 (2014)
https://support.microsoft.com/en-us/kb/2904266 (2013)
https://support.microsoft.com/en-us/kb/2779562 (2012)
https://support.microsoft.com/en-us/kb/2633952 (<--- 2011, последний раз когда в Европе что-то менялось.)
P.S. Не хочу участвовать в политических дебатах, но часовые пояса обсудить нужно.
я не то что бы сильно слежу за темой - может еще чего и пропустил - просто время от времени в виндовые апдейты поглядываю.
> но часовые пояса обсудить нужно.
меняют часто только те страны для которых это больших проблем не создаёт.
большие страны - таже Россия - часто этого делать не будет потому что слишком большой эффект у изменения. и как правило самые подверженые "временным" проблемам системы - это финансовые, т.к. все повально всё ещё в местном времени ведут учёт переводов и платежей.
В 2011-м году говорили, что реформа будет последней и больше ничего переводить не будем. Прошло три года и снова реформа.
либо не пользоваться С, а пользоваться С++
> 2х байтовая
Кажется, сегодня чей-то кругозор должен расшириться...
#include <locale>
std::locale rus("russia_russia");
std::locale::global(rus);
char b = 'б';
std::toupper(b, rus);
- в винде и в линухе совершенно разные названия локалей;
- 'б' не всегда помещается в char;
- std::toupper() бесполезен для multibyte кодировок.
Так что без бутылки буста тут не разобраться ;(
- для альтернативных ОС мультибайт надо переводить в вайд, т.к. врядли только апперкейсом ограничится
- std::toupper(std::locale) работает в т.ч. и с вайд
- перевод utf8<->вайд есть в самом с++11 уже (т.к. слямзили с буста)
Правда, даже с вайдом немцы со своим SS соснут. Ну да хрен с ними, всё равно задача ОПа только для русских.
> исходный пост читали
Не барское это дело, исходные посты читать.
И наоборот, насчёт того, преобразовывать ß в SS или оставить, как есть, единого мнения нет.
Кстати, не все редакции журналов признали реформу 1996 года, в результате которой появилось сочетание SSS и пришлось соснуть ещё раз.
В сраной гермашке, как и раньше, нужен словарь. Только теперь словарь нужно обновить, потому что ß теперь пишется чуть-чуть реже.
P.S. В названиях улиц есть. Paßstraße после реформы 1996 называется Passstraße.
https://commons.wikimedia.org/wiki/File:RechtschreibreformBeiStrassennamen. jpg
Schlußstrich → Schlussstrich.
«Заключительный штрих» от Schluẞ→Schluss — «заключение» и Strich — «черта».
Чему ещё я удивляюсь...
Когда в ходу была КОИ-7, компьютерные проблемы вызывали даже строчные буквы, ПОЭТОМУ ВСЕ ПИСАЛИ КАПСОМ. И ЭТО НЕ СЧИТАЛОСЬ ЭКСПРЕССИВНО ОКРАШЕННОЙ РЕЧЬЮ. ЗАТО СКОЛЬКО БАЙТ ЭКОНОМИЛОСЬ; ШИФТ ПЕРЕКЛЮЧАЛ С КИРИЛЛИЦЫ НА ЛАТИНИЦУ, А НЕ СО СТРОЧНЫХ НА ЗАГЛАВНЫЕ. КРАСОТА!
К чему это я? Компьютерные проблемы — временные. Если в 90-х винчестер на гигабайт был пределом мечтаний, то сейчас у обычного школьника в мобильном телефоне карта памяти больше.
*****
Средство для розжига: в турецком языке есть буквы İ («и» заглавная с точкой) и ı («и» строчная без точки). Из-за этой мелочи таблица соответствия заглавных строчным не соответствует европейской. Домашнее задание: предложите реформу турецкой орфографии, чтобы устранить компьютерную проблему.
Да выпилить к чертям ненужную букву!
Вот у украинцев зачем-то три буквы "и" и две буквы "е", если не ошибаюсь. Зачем они? Выпилить, как в русском выпилили лишние буквы.
У нас йэщо остались как минимум буквы тсэ, йэ, йо, йу, йа, которыйэ можно спокойно выпилить. Ну или выпилить э, а йэ оставить. Йэщо мошно выпилить букву, на которуйу начинайэтсьа слово "шопа". Тоше не очэнь нушная буква, всьо равно йэйо мошно спутать с буквой "ш", а так искусствьэнная гранитса будьэт размыта.
doloy inertsiu mishlenia!
О да, теперь вероятность вычислить Вас возросла с примерно 5.99e-9 до 1.06e-7*.
ОЛОЛО ДЕАНОН
_____________________
* некоторые факторы упущены, реальные вероятности могут быть гораздо выше
одна из фоточек которуй выдал гугл по bakagaijin.
Признавайся ты какая из тян.