LINUX.ORG.RU

История изменений

Исправление MOPKOBKA, (текущая версия) :

С помощью ф-ций mbstowcs, mbsrtowcs не удалось.

У меня они тоже в Windows не работают. Почему не хочешь использовать то API для Windows что я предложил в последнем примере? Для Linux ты можешь использовать стандартные функции преобразования wchar_t.

Но если ты хочешь по альфавиту преобразовать буквы, то можешь вот так:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
#include <locale.h>

int to_wchar(const char *s, int n, wchar_t *wch)
{
    int i;
    static const char *ru_table[] = {
        "а", "б", "в", "г", "д", "е", "ж", "з", "и", "й", "к", "л", "м",
        "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ",
        "ъ", "ы", "ь", "э", "ю", "я", "ё",
        "А", "Б", "В", "Г", "Д", "Е", "Ж", "З", "И", "Й", "К", "Л", "М",
        "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ",
        "Ъ", "Ы", "Ь", "Э", "Ю", "Я", "Ё"
    };
    static const wchar_t *ru_table_w[] = {
        L"а", L"б", L"в", L"г", L"д", L"е", L"ж", L"з", L"и", L"й", L"к",
        L"л", L"м", L"н", L"о", L"п", L"р", L"с", L"т", L"у", L"ф", L"х",
        L"ц", L"ч", L"ш", L"щ", L"ъ", L"ы", L"ь", L"э", L"ю", L"я", L"ё",
        L"А", L"Б", L"В", L"Г", L"Д", L"Е", L"Ж", L"З", L"И", L"Й", L"К",
        L"Л", L"М", L"Н", L"О", L"П", L"Р", L"С", L"Т", L"У", L"Ф", L"Х",
        L"Ц", L"Ч", L"Ш", L"Щ", L"Ъ", L"Ы", L"Ь", L"Э", L"Ю", L"Я", L"Ё"
    };

    if (n > 1) {
        for (i = 0; i < sizeof(ru_table)/sizeof(const char*); i++) {
            if (s[0] == ru_table[i][0] && s[1] == ru_table[i][1]) {
                *wch = *ru_table_w[i];
                return 2;
            }
        }
    } 

    *wch = s[0];
    return 1;
}

void print_as_wchar(const char *s)
{
    wchar_t wch;
    int i, s_len = strlen(s);

    for (i = 0; i < s_len;) {
        i += to_wchar(&s[i], s_len - i, &wch);
        putwc(wch, stdout);
    }
}

int main(int argc, char **argv)
{
    setlocale(LC_ALL, "");
    print_as_wchar("Привет world!");
    return 0;
}

Исходная версия MOPKOBKA, :

С помощью ф-ций mbstowcs, mbsrtowcs не удалось.

У меня они тоже в Windows не работают. Почему не хочешь использовать то API для Windows что я предложил в последнем примере? Для Linux ты можешь использовать стандартные функции преобразования wchar_t.

Но если ты хочешь по альфавиту преобразовать буквы, то можешь вот так:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wchar.h>
#include <locale.h>

int to_wchar(const char *s, int n, wchar_t *wch)
{
    int i;
    static const char *ru_table[] = {
        "а", "б", "в", "г", "д", "е", "ж", "з", "и", "й", "к", "л", "м",
        "н", "о", "п", "р", "с", "т", "у", "ф", "х", "ц", "ч", "ш", "щ",
        "ъ", "ы", "ь", "э", "ю", "я", "ё",
        "А", "Б", "В", "Г", "Д", "Е", "Ж", "З", "И", "Й", "К", "Л", "М",
        "Н", "О", "П", "Р", "С", "Т", "У", "Ф", "Х", "Ц", "Ч", "Ш", "Щ",
        "Ъ", "Ы", "Ь", "Э", "Ю", "Я", "Ё"
    };
    static const wchar_t *ru_table_w[] = {
        L"а", L"б", L"в", L"г", L"д", L"е", L"ж", L"з", L"и", L"й", L"к",
        L"л", L"м", L"н", L"о", L"п", L"р", L"с", L"т", L"у", L"ф", L"х",
        L"ц", L"ч", L"ш", L"щ", L"ъ", L"ы", L"ь", L"э", L"ю", L"я", L"ё",
        L"А", L"Б", L"В", L"Г", L"Д", L"Е", L"Ж", L"З", L"И", L"Й", L"К",
        L"Л", L"М", L"Н", L"О", L"П", L"Р", L"С", L"Т", L"У", L"Ф", L"Х",
        L"Ц", L"Ч", L"Ш", L"Щ", L"Ъ", L"Ы", L"Ь", L"Э", L"Ю", L"Я", L"Ё"
    };

    if (n > 1) {
        for (i = 0; i < sizeof(ru_table)/sizeof(const char*); i++) {
            if (memcmp(s, ru_table[i], 2) == 0) {
                *wch = *ru_table_w[i];
                return 2;
            }
        }
    } 

    *wch = s[0];
    return 1;
}

void print_as_wchar(const char *s)
{
    wchar_t wch;
    int i, s_len = strlen(s);

    for (i = 0; i < s_len;) {
        i += to_wchar(&s[i], s_len - i, &wch);
        putwc(wch, stdout);
    }
}

int main(int argc, char **argv)
{
    setlocale(LC_ALL, "");
    print_as_wchar("Привет world!");
    return 0;
}