MSDN.WhiteKnight - Stack Overflow answers
Ответ на "Как в C использовать, работать с русскими символами в консоли?"
Answer 954876
Со строками национальных алфавитов можно работать как с многобайтовыми (UTF8) или как со строками широких символов.
При использовании UTF8 каждый символ строки занимает переменное число байтов, поэтому работать со строкой как с массивом символов нельзя! Для доступа к отдельным символам надо проходить по всей строке, получая длину каждого символа функцией mbrlen:
#include <stdlib.h> #include <stddef.h> #include <string.h> #include <stdio.h> #include <wchar.h> #include <locale.h> int mbcompare(const char* pStr, int index, const char* pMatch) { mbstate_t mbs = { 0 }; int len = 0; int i = 0; const char* pEnd = pStr + strlen(pStr); mbrlen(NULL, 0, &mbs); while ((len = mbrlen(pStr, pEnd - pStr, &mbs)) > 0) { if (i == index) { return strncmp(pStr, pMatch, len) == 0; } pStr += len; i++; } return 0; } void mbprint(const char* pStr) { mbstate_t mbs = { 0 }; int len = 0; int i = 0; char buf[6]; const char* pEnd = pStr + strlen(pStr); mbrlen(NULL, 0, &mbs); while ((len = mbrlen(pStr, pEnd - pStr, &mbs)) > 0) { strncpy_s(buf,sizeof(buf), pStr, len); printf(u8"%2d: %s (%d байт)\n", i,buf,len); pStr += len; i++; } } int main() { setlocale(LC_ALL, "ru_RU.utf8"); char str[] = u8"Привет Мир!"; mbprint(str); if (mbcompare(str, 1, u8"р")) printf(u8"Символ 1 == [р]\n"); else printf(u8"Символ 1 != [р]\n"); getchar(); } /* Вывод: 0: П (2 байт) 1: р (2 байт) 2: и (2 байт) 3: в (2 байт) 4: е (2 байт) 5: т (2 байт) 6: (1 байт) 7: М (2 байт) 8: и (2 байт) 9: р (2 байт) 10: ! (1 байт) Символ 1 == [р] */
Выглядит не очень удобно? Возможно, проще будет использовать широкие символы:
setlocale(LC_ALL, "ru_RU"); wchar_t str[] = L"Привет Мир!"; int c = wcslen(str); for (int i = 0; i < c; i++) { wprintf(L"%2d: %lc\n", i, str[i]); } if (str[1]==L'р') wprintf(L"Символ 1 == [р]\n"); else wprintf(L"Символ 1 != [р]\n\n");
Content is retrieved from StackExchange API.
Auto-generated by ruso-archive tools.