библиотека возвращает многобайтовые строки - PullRequest
0 голосов
/ 26 января 2020

Я пишу программу, используя code :: blocks на win10 p c. В исполняемой части используется библиотека stati c, разработанная в одной рабочей области и скомпилированная вместе. c :: b настроены с кодировкой по умолчанию (windows -1252) при открытии файлов. Я понимаю, что это старый вид однобайтовой кодировки ... Я возился с изменением кодировки, но это быстро меняет внешний вид литералов после повторного открытия рабочего пространства ... и это быстрый способ отключиться от неправильных действий. c :: b настроены с локалией по умолчанию 'C'.

В любом случае .. У меня есть вектор константных строк, возвращенных из библиотеки .. и я получаю его в строках, размер которых изменился после содержимое char, похоже, было преобразовано несколькими многобайтовыми буквами. Конечно, проблема в том, что используются буквы dani sh. Нечетные превращаются в 2 байта. Если я отображаю 256 символов консоли, я вижу там символы символов нечетных букв dani sh. Почему он не находит ... Это должно быть связано с языком c :: b, равным 'C'. Итак, я начинаю искать имя локали p-1031 * -системы, dani sh. Попытка использовать

int GetUserDefaultLocaleName(
  LPWSTR lpLocaleName,
  int    cchLocaleName
);

не для слабонервных, но я понял это где-то еще на этом форуме. Тем не менее, консоль-программа тестирования ничего не узнает. Попытка этой программы установить новую локаль (locale("en-GB") or locale("en-US")) - это быстрый способ выхода из программы. Идея состояла в том, чтобы cout.imbue(..) посмотреть, принесет ли это.

В любом случае, я не собираюсь использовать строки библиотеки напрямую, но каждая буква должна быть идентификатором в карте текстур, покрывающей изображение соответствующее письмо. Если бы не присутствие одного 3-байтового символа, я мог бы использовать wchar. Я мог бы опустить представление для этого конкретного символа, но теперь это становится вопросом принципов. Это не первый раз, когда я нахожусь вокруг локали и не получаю абсолютно ничего из этого. Бьярн Страуструп добавляет этот пример в свою книгу:

u8"The official vowels in Danish are: a, e, i, o, u, \u00E6, \u00F8, \u00E5 and y"

и мудро добавляет «Печать этой строки дает вам:». Ну, я никогда не видел, чтобы эти гласные появлялись правильно. У меня 25-летний опыт в хобби-программировании, и я решил свои проблемы. Но это, кажется, показывает, насколько я на самом деле сутулый.

..................... редактирует .......... .......

Другая ошибка: вызывающие функции находятся в той же библиотеке, но в конечном итоге работают для внешних вызовов.

#include <Windows.h>
#include <WinNls.h>
    int LOCALE_NAME_MAX_LENGTH =256;
    wchar_t local_name[LOCALE_NAME_MAX_LENGTH]={0} ;//= new wchar_t
    int r = GetUserDefaultLocaleName(local_name, sizeof( sizeof(local_name)/sizeof(wchar_t) ) );
    if(r>0){
        wcout << "locale is " << local_name << "\n";
    }

ошибка отладки: error: GetUserDefaultLocaleName не было объявлено в этой области

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...