Re[3]: C++ и UTF8
От: Banned by IT  
Дата: 28.10.11 02:19
Оценка:
Здравствуйте, gegMOPO4, Вы писали:

MOP>Фактически единственная операция, где std::string недостаточно — обрезка строки по заданному количеству символов.

И ещё вообще везде где надо знать сколько буковок будет выведено.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Забанили по IP, значит пора закрыть эту страницу.
Всем пока
Re[2]: C++ и UTF8
От: MescalitoPeyot Украина  
Дата: 28.10.11 04:29
Оценка: 1 (1)
Здравствуйте, okman, Вы писали:

O>Нельзя использовать строки std:(w)string для работы с UTF-8.

O>Потому что шаблонный тип для basic_string — это char и wchar_t, длина которого фиксирована.
O>В Visual C++ это 1 и 2 байта соответственно. А UTF-8 — многобайтовая кодировка, символ в ней
O>может быть представлен как одним байтом, так и четырьмя.

Изначально подразумевалось что char'ами представляются символы в мультибайтовой кодировке, а wchar_t'ы должны вмещать в себя любой символ из доступного набора. На практике это не всегда так, UTF-16 в винде — это ужас и моральный террор. Для пруфа см. соответствующие разделы стандарта, приложение о локализации в Страуструпе и напр. http://www.cplusplus.com/reference/std/locale/codecvt/max_length/ — функция как раз возвращает максимальную длину символа. Так что мультибайтовость сама по себе использованию std::string и набора функций из <cstring> не мешает. Другое дело что, например, результат std::string::operator==() не более чем результат побитового сравнения, такой же как и strcmp(), и если необходимо нечто иное, то следует использовать strcoll(), std::locale::collate, std::lexicographical_compare и надеятся что они правильно работают на данной платформе.
Re[7]: Это всё условности...
От: okman Беларусь https://searchinform.ru/
Дата: 28.10.11 06:22
Оценка:
Здравствуйте, Erop, Вы писали:

O>>Выполним std::normalize (гипотетический) и забудем.


E>Э-э-э, зачем? Тем более, что в каком-нибудь тайском этот твой std::normalize будет весьма гипотетическим.

E>А ещё есть кроейский, например. Там можно буквы блока (слога) писать, как последовательные юникоды, а можно, как один. И чего?

Суть в том, что хоть какого, — плохого или хорошего, — std::normalize в C++ нету.

E>Нипиши правильный локейл и всё будет...


Какой ? К примеру, на Visual C++ любые конструкторы std::locale, инициализированные строками
вроде "ru_RU.utf-8", обламываются.

E>Да используй [ICU], ради Бога, если тебе это нужно/удобно и всё такое. Но это ни разу не единственное верное решение...


Возражал не я, возражали мне.
Re[7]: C++ и UTF8
От: okman Беларусь https://searchinform.ru/
Дата: 28.10.11 06:22
Оценка:
Здравствуйте, gegMOPO4, Вы писали:

MOP>В 90% задач toupper/tolower не нужны.


MOP>В 90% оставшихся достаточно toupper/tolower только с ASCII.


MOP>Оставшийся 1% — где действительно нужно, и UTF-16 или UTF-32 сами по себе не помогут


MOP>в 90% его не используют и работают с регистром неправильно.


MOP>Подавляющее большинство токенайзеров (использующих разделители из ASCII) будут работать правильно.


MOP>Это очень специфичные задачи, где могло бы понадобиться.


MOP>Затем, что в подавляющем числе случаев «жонглировать» не нужно.


Когда возражения приводятся в таком ключе, спорить неинтересно.
Re[7]: Это всё условности...
От: MescalitoPeyot Украина  
Дата: 28.10.11 06:28
Оценка:
Здравствуйте, Erop, Вы писали:

O>>Выполним std::normalize (гипотетический) и забудем.


E>Э-э-э, зачем? Тем более, что в каком-нибудь тайском этот твой std::normalize будет весьма гипотетическим.

E>А ещё есть кроейский, например. Там можно буквы блока (слога) писать, как последовательные юникоды, а можно, как один. И чего?

Дык есть же std::locale::collate::transform, ни разу не гипотетический.
Re[7]: C++ и UTF8
От: sidorov18 США  
Дата: 28.10.11 07:02
Оценка:
Здравствуйте, Mystic, Вы писали:

M>Здравствуйте, sidorov18, Вы писали:


S>>что значит переводить?

M>WinAPI вроде как работает в UCS-2. Как минимум, это ограничивает набор символов 65536-ю символами. Но все равно необходимо перевести из UTF-16 в UCS-2. Некоторые кроссплатформенные либы принимают все-таки UTF-8. Ну и под другие OS UTF-8 нативнее.

хм. а источник есть?

в википедии написано что UCS-2 использовался до 2000 винды.

UTF-16 is used for text used in the OS API in Microsoft Windows 2000/XP/2003/Vista/CE.[8] Older Windows NT systems (prior to Windows 2000) only support UCS-2.[9]


http://en.wikipedia.org/wiki/UTF-16


S>>
S>>"Василий"//L"Василий"
S>>


S>>вот так переводить?

S>>решается макросом _T()

M>А тогда вопрос, как макрос _T узнает кодировку, в которой набран текст?


Наверное компилятор, а не макрос _T?
По кодировке исходника.
Или вы имеете ввиду, что компилятору прийдется перекодировать UTF-8 в UTF-16?
Re[16]: C++ и UTF8
От: gegMOPO4  
Дата: 28.10.11 07:10
Оценка: -1
Здравствуйте, Erop, Вы писали:
E>Я ещё раз говорю, что все три UTF примерно одинаково удобны или неудобны...

А вот с этим категорически не соглашусь. Они все неудобны (или удобны) по-разному!
Re[9]: C++ и UTF8
От: Erop Россия  
Дата: 28.10.11 07:11
Оценка: 1 (1)
Здравствуйте, Pavel Dvorkin, Вы писали:

PD>Здравствуйте, Erop, Вы писали:


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



PD>LCMapString

PD>For a locale specified by identifier, maps one input character string to another using a specified transformation, or generates a sort key for the input string.

PD>int LCMapString(

PD> LCID Locale,
PD> DWORD dwMapFlags,
PD> LPCTSTR lpSrcStr,
PD> int cchSrc,
PD> LPTSTR lpDestStr,
PD> int cchDest
PD>);


PD>LCMAP_LOWERCASE For locales and scripts capable of handling uppercase and lowercase, map all characters to lowercase.

PD>LCMAP_UPPERCASE For locales and scripts capable of handling uppercase and lowercase, map all characters to uppercase

Ты не то выделил, IMHO...
Как это не печально, но в разных языках РАЗНОЕ соответствие больших букв маленьким. Разное и всё тут, хоть ты тресни.
Так что если язык не знаешь, а знаешь только буквы, например UTF-16, то фиг ты чего сконвертируешь

Примеры "разного"
1) Что делать с SS в немецком.
2) Что делать с диакритикой в язвках, где над большими буквами не пишут диакритических знаков?
3) Буква I бывает с точкой и без точки, как большая, так и маленькая. При этом в некоторых языках, например в турецком, маленькой с точкой соответствуюе большая с точкой, а большой без точки соответствует маленькая, тоже без точки, а вот в некоторых других языках, например в английском, всё перепутано. Большой без точки соответствует маленькая СТОЧКОЙ, и наоборот...
4) И т. д...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: C++ и UTF8
От: gegMOPO4  
Дата: 28.10.11 07:18
Оценка: +1
Здравствуйте, Banned by IT, Вы писали:
BBI>Здравствуйте, gegMOPO4, Вы писали:
MOP>>Фактически единственная операция, где std::string недостаточно — обрезка строки по заданному количеству символов.
BBI>И ещё вообще везде где надо знать сколько буковок будет выведено.

…но достаточно u32string…

Нет, для числа буковок строки в UTF-32 недостаточно.
Re[7]: C++ и UTF8
От: sidorov18 США  
Дата: 28.10.11 07:20
Оценка: +2
Здравствуйте, gegMOPO4, Вы писали:

MOP>Т.е. нет проблем конвертировать каждый раз для COM?


Нет. но...
В моей практике — в винде я всегда использовал UTF-16. И с этим небыло проблем.
Конвертировать самому в UTF-8 — только для HTTP POST запросов. которые посылались не часто и не несли тонны текста.

Поскольку использовалось много COM-а — в противом случае нужно было бы много конвертировать.

Все таки маленький, но плюс — больше конвертировать или меньше конвертировать..

S>>Расход памяти тоже в большинстве случаев незаметен.


MOP>Это аргумент в основном для англоязычных. Очень много было криков из-за того, что Python3 требует в 2-4 раза больше памяти при работе с текстом, чем Python2 на тех же задачах. Хуже, что и скорость соответственно падала (а как вы думаете, вдвое больше байт перемолотить). Идентификаторы, ключевые слова, числа в десятичной записи, имена файлов, URL-ы — как правило помещаются в ASCII, поэтому это касается не только англоязычных.


Может..
На студия я не жалуюсь. Возможности проверить нет, конечно, но сомневаюсь, что они используют там внутри UTF-8.

S>>И что за проблема 0-го байта?


MOP>Функции, ожидающие ASCIIZ, споткнутся на первом же байте со значением 0. В UTF-16 это скорее всего будет в одном из первых символов.


тю, ну ясен пень. Проблема бабушки в том, что она не дедушка?
А вы запихните UTF-8 строку в wchar_t* и вызовите CreateFile. Интересно, откроется?
Это будет уже проблемой UTF-8?

MOP>>>А вот чем UTF-16 лучше UTF-8? Ничем. Сохраняет недостатки UTF-8 и добавляет свои.

S>>в соседней ветке уточняем по поводу доступа по индексу.

MOP>Доступ по индексу — довольно редкая операция (может чуть чаще, чем языкозависимое сравнение строк без учёта регистра). И если нужно — можно и ICU подключить (впрочем, именно для этого есть и полегче библиотеки).


Может. Справедливости ради — сам не сталкивался. Но та же винда внутри этим должна заниматся. при переносе строк и т.п.

S>>Но проблема совместимости так же актуальна и для UTF-8. Здесь вопрос окружения, а не ситуация, если бы

S>>везде был UTF-8.

MOP>Это Microsoft создала эту проблему и практически единственная причина для работы с UTF-16 — её обход.


Ну да.... если бы не майкросовт...
Re[8]: Ох уж эти любители серябрянных пуль... ;)
От: Erop Россия  
Дата: 28.10.11 07:20
Оценка:
Здравствуйте, okman, Вы писали:

O>Суть в том, что хоть какого, — плохого или хорошего, — std::normalize в C++ нету.


Суть ещё хуже. Его нет не только в С++, но и нигде. Для юникода нельзя задать такое универсальное отображение, увы и ах...

O>Какой ? К примеру, на Visual C++ любые конструкторы std::locale, инициализированные строками

O>вроде "ru_RU.utf-8", обламываются.

Ну ты же сам можешь его реализовать, если библа не поддреживает...

O>Возражал не я, возражали мне.

Не-не-не, ты говорил, что типа так и никак иначе... На это и возражали. Иначе тоже можно. Серебрянной пули и правда не бывает
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[4]: C++ и UTF8
От: Erop Россия  
Дата: 28.10.11 07:27
Оценка:
Здравствуйте, Banned by IT, Вы писали:

BBI>И ещё вообще везде где надо знать сколько буковок будет выведено.


А что значит "буковок"? Вот, например, Ы -- это скока буковок?.. А арабское слово, какое-нибудь? А арабское слово с огласовками?
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: Это всё условности...
От: Erop Россия  
Дата: 28.10.11 07:30
Оценка:
Здравствуйте, MescalitoPeyot, Вы писали:

MP>Дык есть же std::locale::collate::transform, ни разу не гипотетический.


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

Вот, например, во-французском языке принято (допустимо и широко используется) опускать диакоритику над большими буквами. Но недопустимо сбрасывать регистр букв в именах собственных.

И как будем нормалайз писать?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[17]: C++ и UTF8
От: Erop Россия  
Дата: 28.10.11 07:32
Оценка:
Здравствуйте, gegMOPO4, Вы писали:

MOP>А вот с этим категорически не соглашусь. Они все неудобны (или удобны) по-разному!


IMHO, сами по себе они примерно эквивалентны, за исключением регистра букв, но у разных библ и API интерфейс в разных кодировках... Вот и вся разница. Есть какая-то ещё?..
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[5]: C++ и UTF8
От: Erop Россия  
Дата: 28.10.11 07:34
Оценка: +1
Здравствуйте, gegMOPO4, Вы писали:

MOP>Нет, для числа буковок строки в UTF-32 недостаточно.


Да и само по себе понятие "число буковок" крайне мутное...

Интереснее обсуждать не предрассудки, а задачи. От задачи можно было бы хотя бы понять физ. смысл того "из чисел букв", которое имеется в виду...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: C++ и UTF8
От: Erop Россия  
Дата: 28.10.11 07:36
Оценка: +1
Здравствуйте, sidorov18, Вы писали:

S>Все таки маленький, но плюс — больше конвертировать или меньше конвертировать..


Ну и распечатать/посмотреть/что-то ещё сделать для отлдаки, например, в винде с UTF-16 строкой проще, чем с UTF-8...

S>>>в соседней ветке уточняем по поводу доступа по индексу.

Доступ по индексу имеет смысл обсуждать, только после того, как поределимся с тем, что такое буква...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re[8]: C++ и UTF8
От: gegMOPO4  
Дата: 28.10.11 07:42
Оценка:
Здравствуйте, sidorov18, Вы писали:
S>Поскольку использовалось много COM-а — в противом случае нужно было бы много конвертировать.
S>Все таки маленький, но плюс — больше конвертировать или меньше конвертировать..

Согласен. А если это не надо, то и выбор UTF-16 становится намного менее обоснованным.

S>А вы запихните UTF-8 строку в wchar_t* и вызовите CreateFile. Интересно, откроется?

S>Это будет уже проблемой UTF-8?

Какой ещё CreateFile-Shmile? Мы в форуме C++ или где? fopen, fstream скорее заработают с UTF-8, чем с wchar_t.
Re[7]: C++ и UTF8
От: sidorov18 США  
Дата: 28.10.11 07:46
Оценка: 1 (1) +1 :))
Здравствуйте, gegMOPO4, Вы писали:

MOP>Здравствуйте, okman, Вы писали:

O>>Это значит, что уже только сравнение строк в UTF-8 без учета регистра запросто обломается.
O>>Как и всякие toupper/tolower.

MOP>В 90% задач toupper/tolower не нужны. В 90% оставшихся достаточно toupper/tolower только с ASCII. Оставшийся 1% — где действительно нужно, и UTF-16 или UTF-32 сами по себе не помогут, нужно использовать ICU (но в 90% его не используют и работают с регистром неправильно ).


Похоже на то, что спорят тут негры с финами — нужна куртка зимняя или нет.
фины говорят, что нужна, а то замерзнешь. А негры говорят — холод — это очень специфическая температура, встречающаяся раз в 100 лет. И для нее сойдет и 3 свитера, нахрен куртка.

Что касается UTF-16 — в каких языках она не покрывает символ/2 байта?
Re[18]: C++ и UTF8
От: gegMOPO4  
Дата: 28.10.11 07:48
Оценка:
Здравствуйте, Erop, Вы писали:
E>Здравствуйте, gegMOPO4, Вы писали:
MOP>>А вот с этим категорически не соглашусь. Они все неудобны (или удобны) по-разному!
E>IMHO, сами по себе они примерно эквивалентны, за исключением регистра букв, но у разных библ и API интерфейс в разных кодировках... Вот и вся разница. Есть какая-то ещё?..

Мало?
Re[9]: C++ и UTF8
От: sidorov18 США  
Дата: 28.10.11 08:00
Оценка: +1
Здравствуйте, gegMOPO4, Вы писали:

S>>А вы запихните UTF-8 строку в wchar_t* и вызовите CreateFile. Интересно, откроется?

S>>Это будет уже проблемой UTF-8?

MOP>Какой ещё CreateFile-Shmile? Мы в форуме C++ или где? fopen, fstream скорее заработают с UTF-8, чем с wchar_t.


Все правильно. Ну так какой был довод такой и контрдовод.
Не суйте UTF-16 туда, где предполагается ANSI и наоорот.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.