2013-08-02 3 views
-1

В настоящее время у меня есть этот символ ° (символ степени), который мне нужно преобразовать в /00B0. Я заметил, что есть библиотека под названием ICU для C/C++, но мне нужно будет использовать такую ​​библиотеку? Мой вход кодируется как ISO/IEC 8859-1.Преобразование специальных символов в unicode C++

Имеет ли общая библиотека C++ эта функция DECODE уже реализована или библиотека ICU необходима для таких операций?

Если есть такой способ вызова персонажа, такого как °, пожалуйста, перешлите меня на такой или напишите быстрый пример? :).

EDIT Итак, я просматриваю целую строку, и когда я вижу специальный символ, или, скорее, некоторый символ, который не является альфа-символом, символом цифры, символом «-» или «», я прошу вывод символа, который не прошел ни один из этих тестов.

Я получаю вывод как \303, который является форматом OCTAL специального символа. Heres код я использую, чтобы сделать тесты:

if (isalpha(aline[i+1]) || isdigit(aline[i+1]) || aline[i+1] == '-' || aline[i+1] == ' ') 
    regionName.push_back(aline[i+1]); 
else 
    cout << aline[i+1] << endl; 

Таким образом, когда выполняется оператор еще, я получаю восьмеричной выходы ... по умолчанию ... Как бы я изменить это в формат Юникод?

Пример вывода:

\303 
\203 
\302 
+1

«Я получаю восьмиричные выходы ... «как в, он буквально печатает' \ 303'? –

+0

yeah ... выход по какой-то причине возвращает эти значения:/ – jsetting32

+0

, когда выполняется инструкция else, я либо получаю upsidedown вопросительные знаки (найденные пробелы), либо '\' с тремя цифрами, предшествующими – jsetting32

ответ

0

Welp, heres ответ мне нужен :) отлично работает !!

включает в себя следующие библиотеки:

#include <sstream> 
#include <iomanip> 

и передать любую строку вам нравится в функцию, то она будет кодировать все символы, которые «специальные»

static string EncodeNonASCIICharacters (std::string value) 
{ 
    ostringstream stringBuilder; 

    for (int i = 0; i < value.length(); i++) 
    { 

     unsigned int character = *reinterpret_cast<unsigned char *>(&(value[i])); 
     if (character > 127) 
     { 
      stringBuilder << "\\u"; 
      stringBuilder << setw(4) << hex << setfill('0') << character; 
     } else { 
      string aValue; 
      aValue += value[i]; 
      stringBuilder << aValue; 
     } 
    } 

    return stringBuilder.str(); 
} 
+0

FYI, это интерпретирует ввод как кодированный кодировкой ISO/IEC 8859-1. –

0

Есть три основные вещи, когда дело доходит до UNICODE.

  1. чтения символов
  2. хранения символов в памяти
  3. запись/отображении символов

В Юникоде-приложениях строка, как правило, хранится в виде 2-байтовых символов. Для 1 и 3 в простом C++ ничего нет. Стандартная библиотека C++ для Point 2 предлагает вам класс wstring для хранения символов в виде 2-байтовых строк.

Если вы скажете: «У меня есть символ», что вы имеете в виду? У вас есть это в файле? Вы читаете его с консоли? В обоих случаях вам нужно знать кодировку вашего источника входного сигнала.

При отображении символа, вы должны быть уверены, что ваша библиотека графического интерфейса может обрабатывать unicode.

Так основные шаги в псевдо-коде:

char* myData = "some local-encoding data"; 
MyUnicodeCapableStrincClass myString = MyUnicodeCapableStrincClass::fromsomeLocalEncoding(myData); 
MyUnicodeCapableGuiTextControl.setText(myString); 

Зная это, вы должны найти пример кода в ОИТ документации быстрее, я надеюсь. Я до сих пор не знал о ICU. (Я использую Qt - там включен unicode с 1998 года.)

+0

Я просто собираюсь предположить, что это заполнитель для фактического ответа ... –

+0

@DrewMcGowenL ответ был заполнен –

+1

Аппетитно [Qt is изменилось, чтобы использовать ICU в качестве backend] (http://qt-project.org/wiki/Qt-5-ICU) –