Как работать с символами Unicode в C ++ - PullRequest
1 голос
/ 10 февраля 2012

У нас есть система комментариев, встроенная в наш движок, которая позволяет программистам размещать комментарии для различных открытых переменных / объектов, которые затем используются интерфейсом GUI для подсказок и помощи.

В последнее время некоторые всплывающие подсказки начали давать сбои, и по прошествии большого количества времени я отследил их до символа: , который, если я не ошибаюсь, является символом юникода и недоступен в ASCII.

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

#include <iostream>
#include <string>

using namespace std;

int main()
{
    string someString = "successive attack that DOESN’T result";
    wstring someWString = L"successive attack that DOESN’T result";

    cout << someString << endl;
    wcout << someWString << endl;

    return 0;
}

//Console Output//
successive attack that DOESNÆT result 
successive attack that DOESNPress any key to continue . . .

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

Ответы [ 2 ]

4 голосов
/ 10 февраля 2012

Поскольку вы используете Visual Studio, я предполагаю, что вы используете Windows. Консоль Windows не поддерживает Unicode. Он использует набор символов OEM. Вы можете конвертировать между ними, используя CharToOemW / OemToCharW. Очевидно, он не сможет представлять все символы Юникода.

Windows использует UTF16 для своего системного API. Если ваши всплывающие подсказки используют Windows API, вероятно, вы хотите использовать wstring. Однако вместо этого вы можете использовать UTF8 и преобразовать его в UTF16 перед вызовом Windows API. Это преобразование может быть выполнено с использованием MultiByteToWideChar / WideCharToMultiByte.

1 голос
/ 10 февраля 2012

Поскольку вы имеете дело с символами Юникода, было бы целесообразно, если вы установите Набор символов на Использовать набор символов Юникода в свойствах проектов.

Другой возможной проблемой может быть кодировка исходных файлов .При работе с символами Unicode рекомендуется кодировать исходные файлы в UTF-8 , особенно в файлы, в которых вы определяете строковые литералы, подобные этому.Обратите внимание, что UTF-8 без BOM может быть проблематичным, поскольку Visual Studio нужна эта BOM , чтобы он мог правильно интерпретировать содержимое файлов.Конвертируйте ваши файлы (для этого я использую Notepad ++ ) и конвертируйте их так, чтобы они кодировались в UTF-8

...