Строковые алгоритмы для строк UTF-8 и т. Д. - вычисление длины, анализ и т. Д. Как это лучше всего сделать?
mbrlen дает длину строки C. Я не думаю, что std :: string можно использовать для многобайтовых строк, вы должны использовать wstring для широких.
В общем, вы должны придерживаться UTF-16 внутри вашей программы и использовать UTF-8 только при вводе / выводе (я не знаю других вариантов, но они, безусловно, более сложны и подвержены ошибкам).
Как обращаться с символьными * строками. В конце концов, это может быть без знака или нет, и мне интересно, как определить, какую кодировку они используют (ANSI?) И как преобразовать в UTF-8? Есть ли рекомендуемые материалы по этому вопросу, где документированы основные гарантии C / C ++ относительно строк?
По сути, вы можете использовать любую кодировку, и вам случится использовать собственную кодировку системы, в которой вы работаете, при условии, что это 8-битная кодировка. C был рожден для ASCII, и обработка языка была запоздалой мыслью. В течение многих лет каждая система понимала в основном одну встроенную кодировку, скажем, ISO-8859-x, и файлы из другой кодировки могли даже не быть представленными.
Поскольку для строк UTF-8 один байт не всегда является одним символом, я предполагаю , что наиболее безопасным вариантом является использование для них многобайтовой строки. Руководства C, которые я использовал, описывали многобайтовую строку в абстрактной форме, без подробностей по этим вопросам (в частности, по используемой кодировке). Для C, смотрите такие функции, как mbrlen и mbrtowc. В моей системе Linux отмечено, что их поведение зависит от LC_CTYPE, и это, вероятно, означает, что это собственный тип многобайтовых строк. Из документации можно сделать вывод, что их API поддерживает также кодировки, в которых вы можете переходить с однобайтового на двухбайтовый и обратно.
Как обращаться с символьными * строками. В конце концов, это может быть без знака или без
Если вы полагаетесь на подпись char, вы делаете это неправильно. Подпись символов имеет значение только в том случае, если вы используете символ в качестве числового типа, и тогда вы всегда должны использовать либо без знака, либо со знаком символы; на самом деле, вы должны сделать вид, что обычный символ не является ни беззнаковым, ни со знаком, и что выражение типа a > 0
(если a является символом) имеет неопределенную семантику. Но для чего это все-таки полезно?