Расширение 'isalnum' для распознавания UTF-8 umlaut - PullRequest
2 голосов
/ 11 октября 2011

Я написал функцию, которая расширяет isalnum, чтобы распознавать кодировку UTF-8.

Может быть, есть более элегантный способ решить эту проблему?

Код выглядит следующим образом:

bool isalnumlaut(const char character) {
    int cr = (int) (unsigned char) character;
    if (isalnum(character)
            || cr == 195 // UTF-8
            || cr == 132 // Ä
            || cr == 164 // ä
            || cr == 150 // Ö
            || cr == 182 // ö
            || cr == 156 // Ü
            || cr == 188 // ü
            || cr == 159 // ß
    ) {
        return true;
    } else {
        return false;
    }
}

EDIT:

Я уже несколько раз тестировал свое решение, и, похоже, оно выполняет мою задачу. Есть сильные возражения?

Ответы [ 3 ]

5 голосов
/ 11 октября 2011

Ваш код не выполняет то, на что вы претендуете.

Представление utf-8 Ä составляет два байта - 0xC3,0x84. Одинокий байт со значением выше 0x7F не имеет смысла в utf-8.


Некоторые общие предложения:

  • Юникод большой. Подумайте об использовании библиотеки, которая уже обработала проблемы, с которыми вы сталкиваетесь, например, ICU .

  • Не часто имеет смысл работать с одной кодовой единицей или с кодовой точкой . Гораздо более разумно иметь функции, которые работают либо с диапазонами кодовых точек, либо с отдельными глифами (определения этих терминов см. здесь ).

  • Ваша буквенно-цифровая концепция, вероятно, недостаточно указана для набора символов, такого же универсального, как Набор символов; Вы хотите рассматривать символы в кириллице как алфавитно-цифровые? Концепция Unicode о том, что является алфавитным, может не совпадать с вашей - особенно, если вы ее не учли.

1 голос
/ 11 октября 2011

Это невозможно с интерфейсом, который вы определяете, поскольку UTF-8 является многобайтовой кодировкой;один символ требует нескольких char для его представления.(У меня есть код для определения того, является ли UTF-8 членом указанного набора символов в моей библиотеке, но символ задается парой итераторов, а не одним char.)

1 голос
/ 11 октября 2011

Я не уверен на 100%, но C ++ std::isalnum в <locale> почти наверняка распознает дополнительные символы для конкретной локали: http://www.cplusplus.com/reference/std/locale/isalnum/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...