История изменений
Исправление
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;
}