Поиск…


замечания

Язык C ++ не диктует какой-либо набор символов, некоторые компиляторы могут поддерживать использование UTF-8 или даже UTF-16. Однако нет уверенности в том, что будет предоставлено что-либо помимо простых символов ANSI / ASCII.

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

Несколько сторонних библиотек (таких как Международная библиотека Юникодского комитета), которые могут быть использованы для расширения международной поддержки платформы.

Понимание строковых характеристик C ++

#include <iostream>
#include <string>

int main()
{
    const char * C_String = "This is a line of text w";
    const char * C_Problem_String = "This is a line of text ኚ";
    std::string Std_String("This is a second line of text w");
    std::string Std_Problem_String("This is a second line of ϯϵxϯ ኚ");

    std::cout << "String Length: " << Std_String.length() << '\n';
    std::cout << "String Length: " << Std_Problem_String.length() << '\n';

    std::cout << "CString Length: " << strlen(C_String) << '\n';
    std::cout << "CString Length: " << strlen(C_Problem_String) << '\n';
    return 0;
}

В зависимости от платформы (Windows, OSX и т. Д.) И компилятора (GCC, MSVC и т. Д.), Эта программа может не скомпилироваться, отображать разные значения или отображать одни и те же значения .

Пример вывода в компиляторе Microsoft MSVC:

Длина строки: 31
Длина строки: 31
CString Длина: 24
CString Длина: 24

Это показывает, что в MSVC каждый из расширенных символов считается единственным «символом», и эта платформа полностью поддерживает интернационализированные языки.
Следует отметить, однако, что это поведение необычно, эти международные символы хранятся внутри как Unicode и, следовательно, на самом деле составляют несколько байтов. Это может вызвать непредвиденные ошибки

В компиляторе GNC / GCC вывод программы:

Длина строки: 31
Длина строки: 36
CString Длина: 24
CString Длина: 26

Этот пример демонстрирует, что, хотя компилятор GCC, используемый на этой платформе (Linux), поддерживает эти расширенные символы, он также использует ( правильно) несколько байтов для хранения отдельного символа.
В этом случае использование символов Unicode возможно, но программист должен проявлять большую осторожность, помня, что длина «строки» в этом сценарии - это длина в байтах , а не длина в читаемых символах .

Эти различия связаны с тем, как обрабатываются международные языки на основе каждой платформы, и что более важно, что строки C и C ++, используемые в этом примере, можно рассматривать как массив байтов , такой, что (для этого использования) язык C ++ считает символ (char) должен быть одним байтом .



Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow