C ++: получение значения ASCII широкого символа - PullRequest
0 голосов
/ 05 марта 2010

скажем, у меня есть массив символов типа "äa".Есть ли способ получить значение ASCII (например, 228) первого символа, который является многобайтовым?даже если я приведу свой массив к массиву wchar_t *, я не смогу получить значение ascii "ä", потому что его длина составляет 2 байта.Есть ли способ сделать это, я пытаюсь в течение 2 дней: (* ​​1001 *

я использую gcc.

спасибо!

Ответы [ 5 ]

4 голосов
/ 05 марта 2010

Ты противоречишь себе.Международные символы, такие как ä, (по определению) не в наборе символов ASCII, поэтому у них нет «значения ascii».

Это зависит от точной кодировки вашегомассив символов, если вы можете получить кодовую точку для одного символа или нет, и если да, то в каком формате он будет.

2 голосов
/ 05 марта 2010

Вы очень смущены. ASCII имеет только значения меньше 128. Значение 228 соответствует 8-битным наборам символов ISO-8859-1, CP1252 и некоторым другим. Это также значение UCS в системе Unicode. Если вы используете строковый литерал "ä" и получаете строку из двух символов, строка фактически кодируется в UTF-8, и вы можете захотеть проанализировать кодировку UTF-8 для получения значений UCS Unicode.

Скорее всего, вы действительно хотите конвертировать из одного набора символов в другой. Как это сделать, зависит от вашей операционной системы, поэтому требуется больше информации. Вам также нужно указать, что именно вы хотите? Возможно, std :: string или char * ISO-8859-1?

1 голос
/ 05 марта 2010

Для этого преобразования имеется стандартная шаблонная функция C ++, ctype :: Узкий () . Он является частью библиотеки локализации . Если это возможно, он преобразует широкий символ в эквивалентное значение для вашего текущего локального символа. Как указывалось в других ответах, сопоставление не всегда происходит, поэтому ctype :: thin () принимает символ по умолчанию, который он будет возвращать, если сопоставления нет.

1 голос
/ 05 марта 2010

Зависит от кодировки, используемой в вашем массиве символов.

Если ваш массив символов кодируется латиницей 1, то он имеет длину 2 байта (плюс, возможно, терминатор NUL, нам все равно), и эти 2 байта:

  • 0xE4 (строчные буквы умлаут)
  • 0x61 (строчные буквы a).

Обратите внимание, что Latin 1 не является ASCII, а 0xE4 не является значением ASCII, это значение Latin 1 (или Unicode).

Вы бы получили значение следующим образом:

int i = (unsigned char) my_array[0];

Если ваш массив символов имеет кодировку UTF-8, то он имеет длину три байта и эти байты:

  • двоичный код 11000011 (первый байт в кодировке UTF-8 0xE4)
  • двоичный 10100100 (второй байт в кодировке UTF-8 0xE4)
  • 0x61 (строчные буквы)

Чтобы восстановить значение Unicode символа, закодированного с помощью UTF-8, вам нужно либо реализовать его самостоятельно на основе http://en.wikipedia.org/wiki/UTF-8#Description (обычно это плохая идея в рабочем коде), либо вам нужно использовать платформу -конкретная процедура преобразования unicode в wchar_t. В linux это mbstowcs или iconv, хотя для одного символа вы можете использовать mbtowc при условии, что многобайтовая кодировка, определенная для текущей локали, на самом деле UTF-8:

wchar_t i;
if (mbtowc(&i, my_array, 3) == -1) {
    // handle error
}

Если это SHIFT-JIS, то это не сработает ...

0 голосов
/ 05 марта 2010

то, что вы хотите, называется транслитерацией - преобразование букв одного языка в другой.в нем нет ничего о юникоде и wchars.вам нужно иметь таблицу отображения.

...