LINUX.ORG.RU

Сопоставить символы из разных раскладок между собой

 


0

2

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

Как без заморочек о типах раскладок (всякие QWERTY и AZERTY) получить латинскую букву передав на вход что-то из нелатинской раскладки? Например:

char translate(wchar_t sym);
cout << translate(L'й')
     << translate(L'ц')
     << translate(L'у')
     << translate(L'к')
     << translate(L'е')
     << translate(L'н');
// cout: qwerty

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

★★
Ответ на: комментарий от vM

В ИТ есть только латиница, всё остальное - юзерфрендли игрушки для домохозяек. Это не я так решил, а Юникод окончательно закрепил такое положение дел, работа с символами выше ASCII - дорого, сложно и костыли, особое удовольствие от композиций/декомпозиций. Далеко ходить не надо - у меня в терминале неправильно отображается ‘Ё’ в виде декомпозиции const wchar_t src[] = L"\u0415\u0308"; cout << src << endl;. Поделки прогеров - костыль на костыле, сходил сюда, ожидаемо получил невалидную работу в случае скармливания поделке юникодных декомпозиций (это отдельный баг несвязанный с терминалом). В общем пусть все эти ребята из консорциума берут свою ужасную ICU и сами пишут тормозной ширпотреб для девочек из бухгалтерии, так страдать из-за работы с текстом лично я не собираюсь.

kvpfs ★★
() автор топика
Ответ на: комментарий от kvpfs

В ИТ есть только латиница, всё остальное - юзерфрендли игрушки для домохозяек.

Просто англосаксонский мир разработал архитектуру работы с кодовыми страницами удобными для них.
Да и в 1812 году были такие-же приоритеты при разработке.
Выше был пост о том, что нужно разработать новую архитектуру кодовых страниц.
Немножко скажу об недостатке к примеру CP1251 кодовой страницы.

1) Коды с 0 по 31 являются управляющими.
   Зачем их тулить во все страницы.

2) Имеются набор кодов для строчных и прописных букв.
   Зачем если достаточно одного флага в коде символа, который 
   будет уведомлять об этом.
...

Воообщем

РАЗРАБОТАЮ новые кодировки и API для работы с строками ...
anonymous
()
Ответ на: комментарий от kvpfs

Ну как это возможно? Никто не замечает как оно всё криво?

#include <iostream>
#include <string>
#include <locale>
 
template<typename CharT>
void try_compare(const std::locale& l, const CharT* p1, const CharT* p2) {
    auto& f = std::use_facet<std::collate<CharT>>(l);
 
    std::basic_string<CharT> s1(p1), s2(p2);
    int res = f.compare(&s1[0], &s1[0] + s1.size(),
                 &s2[0], &s2[0] + s2.size() );
    if (res < 0)
         std::wcout << p1 << " before " << p2 << '\n';
    else if (res > 0)
         std::wcout << p2 << " before " << p1 << '\n';
    else
        std::wcout << p2 << " equal " << p1 << '\n';
}
 
int main() {
    std::locale::global(std::locale("ru_RU.utf8"));
    try_compare(std::locale(), L"\u0415\u0308", L"\u0401");
}


$ g++ 1.cpp
$ ./a.out > out
$ что_умееющее_юникод out
Ё before Ё

Причём локаль берётся у системы, т.е. даже на таком уровне все кладут на этот Юникод получается.

kvpfs ★★
() автор топика
Ответ на: комментарий от kvpfs

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

den73 ★★★★★
()
Последнее исправление: den73 (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.