Как преобразовать UTF символ в Windows-1252? - PullRequest
1 голос
/ 29 марта 2019

У меня есть строка с символом валюты:

std::string currency = "€";

Я преобразовал ее в символы без знака:

const unsigned char* buf = reinterpret_cast<unsigned const char*>(currency.data());

for(auto i = 0u; i < currency.length(); ++i)
{
    std::cout << std::hex << static_cast<int>(buf[i]) << std::endl;

}

и в соответствии с это описание Iполучить UTF-8 символьное представление: 0xE2 0x82 0xAC.Я использую gcc / Linux.

1. Это кроссплатформенное поведение C ++?

У меня есть устройство, которое использует кодировку windows-1252, где символ валюты евро представлен 0x80.

2.Как выполнить преобразование из UTF-8 в windows-1252?Возможно ли это более общим / автоматическим способом, чем:

unsigned char eurWindows1252;
if(currency == "€")
{
    eurWindows1252 = 0x80;
}

1 Ответ

1 голос
/ 29 марта 2019

Для корректной работы с Unicode вам нужно знать всегда кодировку ваших строк.Приведенный ниже код не определяет кодировку, поэтому это плохая отправная точка, если вам нужен переносимый код:

std :: string currency = "€";

В C ++ 11 самое простое решение - использовать префикс кодировки, например, для UTF-8 у нас есть:

std :: string currency = u8 "€";

Теперь ваша строка эффективно всегда кодируется как UTF-8 на всех платформах, и, получая доступ к отдельным символам в строке, вы получаете отдельные байты UTF-8.

Если у вас нет c ++11 тогда вы, вероятно, будете использовать широкие строки:

std :: wstring currency = L "€";

А затем использовать библиотеки, специфичные для Unicode (ICU, ICONV,Qt, MultiByteToWideChar и т. Д.) Для преобразования вашей строки в UTF-8.

Лично, если вы хотите написать кроссплатформенный код, я бы придерживался C ++ 11 и использовал бы внутренне для всех ваших строк std :: string и кодировку UTF-8 вместе с u8 "...".Это намного проще.

Теперь о преобразовании строки UTF-8 в Windows-1252.Конечно, если вам нужно только преобразовать € и несколько других символов UTF-8, то вы можете сделать это самостоятельно с помощью сравнения строк.Но если необходимые функции (или список строк для преобразования) растут, то, вероятно, лучше использовать одну из уже упомянутых библиотек.И выбор сильно зависит от платформ, на которых вы хотите запустить свой код.

Мир Unicode содержит более 100 000 символов.Например, существует много вариантов символа «С».Вы хотите игнорировать все из них (например, преобразовать их в знак вопроса) и рассматривать только старые "С" и "С"?или вы можете также преобразовать «" »в« C », чтобы ваша конверсия обеспечивала большую совместимость?

Возможно, вы захотите взглянуть на следующие вопросы: Переносимый и простой кодировщик Unicodeбиблиотека строк для C / C ++? и Насколько хорошо поддерживается Unicode в C ++ 11?

...