2015-11-24 3 views
3

Я определения длины определенных строк символов в C++ с функцией lenght(), но заметил что-то странное: скажем, я определяю в функции mainКак игнорировать акценты в строке, чтобы она не изменяла ее длину?

string str; 
str = "canción"; 

Тогда, когда я вычислить длину из str по str.lenght() I получить как выход 8. Если вместо этого я определяю str = "cancion" и вычисляю длину str, выход будет 7. Другими словами, акцент на букве «o» изменяет реальную длину строки. То же самое происходит с другими акцентами. Например, если str = "für" скажет мне, что его длина равна 4 вместо 3.

Я хотел бы знать, как игнорировать эти акцентированные символы при определении длины строки; однако я бы не хотел игнорировать отдельные символы, такие как '. Например, если str = livin', длина str должна быть 6.

+2

Если вы используете окна, используйте 'wstring'. Я говорю только для окон из-за [этого] (http://stackoverflow.com/questions/402283/stdwstring-vs-stdstring) –

+0

Вы не получаете дополнительный символ, потому что строка содержит 'o'' или что-то вроде этого, а потому что символ юникода '- состоит из двух байтов. –

+2

Добро пожаловать в печальное слово кодирования текста в исходных литералах, кодирование текста в целом, кодирование переменной длины в частности и, возможно, нормализацию юникода, если вы чувствуете себя достаточно сильным. Прежде всего, вы должны указать кодировку, которую вы используете для текста в своем приложении, для ваших исходных файлов и того, как настроен ваш компилятор в этом отношении. Кроме того, поскольку на стандарте C++ не хватает разговоров об кодировании, зная, какой компилятор вы используете на какой платформе может быть полезен. –

ответ

0

Звучит как кодировка UTF-8. Поскольку символы с акцентами не могут храниться в одном байте, они сохраняются в 2 байтах. См. https://en.wikipedia.org/wiki/UTF-8