Какая функция C может преобразовать À, É в нижнюю à, è?

c locale lowercase tolower

1591 просмотра

2 ответа

9 Репутация автора

Какая функция C может преобразовать À, É в нижнюю à, è?

Я пробовал tolower () и towlower (), но оба не работают.

Автор: L. Feng Источник Размещён: 18.07.2016 03:21

Ответы (2)


2 плюса

15580 Репутация автора

Вы можете использовать функцию буксира :

/* towlower example */
#include <stdio.h>
#include <wctype.h>
#include <wchar.h>
#include <stddef.h>
#include <locale.h>

int main () {

    setlocale(LC_CTYPE, "");
    int i=0;
    wchar_t str[] = L"À TÉst String.\n";
    wchar_t c;
    while (str[i]) {
        c = str[i];
        putwchar (towlower(c));
        i++;
    }
    return 0;
}

Выход:

à tést string.

Программа AC наследует свои переменные окружения локали при запуске
. Это происходит автоматически. Однако эти переменные не
> автоматически управляют локалью, используемой библиотечными функциями,
> потому что ANSI C говорит, что все программы запускаются по умолчанию в стандартной
>> C 'локали. Чтобы использовать локали, указанные средой, вы должны
> вызвать setlocale. Вызовите его следующим образом:
>>
setlocale (LC_ALL, "");

"" Пустое имя говорит о выборе локали на основе переменных среды.

Автор: smac89 Размещён: 18.07.2016 03:53

1 плюс

4319 Репутация автора

Фактическая проблема , что вы столкнулись здесь * (несмотря на предыдущие «ответы»), является то , что у вас есть Unicode строки. * (Или, по крайней мере, какой-то DBCS = "Двухбайтовый набор символов.")

Стандартные функции языка «С» были разработаны «в гораздо более раннее, гораздо более простое время», в котором единственным языковым представлением, которое необходимо было рассмотреть, было ASCIIприсвоение «каждого символа, который должен был быть представлен» в набор из 127 возможных значений. Нигде на этой картинке не было таких «диакритических знаков», как эти. В те простые времена «1 байт = 1 символ».

Чтобы представлять «реальные человеческие (!) Языковые символы», необходимо было принять гораздо более гибкий формат кодирования, который мог бы назначать от 1 до 4 байтов одному «символу». (И, заметьте, консенсус относительно того, «как именно это сделать», не произошел за одну ночь!) В любом случае, «оригинальные» библиотечные подпрограммы, которые вы сейчас используете, не являются «Unicode-осведомленными». (Они никогда не были разработаны, и теперь их нельзя модернизировать ...) Вместо этого должны использоваться альтернативные функции.

Вот хорошая внешняя веб-страница, которая дает довольно хорошее резюме различных проблем, которые необходимо учитывать при использовании C и C ++:

http://www.cprogramming.com/tutorial/unicode.html

--- Редактировать: Когда я сказал, что «единого мнения о том, как это сделать, не произошло в одночасье», мой комментарий должен был иметь потенциально далеко идущие (!) Последствия. «Почему необходимо, даже сегодня, говорить "encoding=UTF-8"? Вот почему. » Единого толкования «как интерпретировать многонациональную последовательность байтов» « никогда не было, и язык« C », особенно,» Я взял его в подбородок. «В сегодняшней среде выполнения« C »имеется более одного полного набора библиотечных функций, которые вам, возможно, понадобится использовать для правильной обработки ваших данных.

Автор: Mike Robinson Размещён: 18.07.2016 03:54
Вопросы из категории :
32x32