Получить латинский символ в C ++ - PullRequest
2 голосов
/ 18 февраля 2020

Я ладья ie с C++. У меня есть строка "tỏa", но я не могу получить символ 'ỏ', и почему длина этой строки равна 5? Как я могу получить этот символ как переменную?

void test() {
    std::string str ("tỏa");
    for(int i=0; i<str.length(); ++i){
        std::cout << str[i] << std::endl;
    }
}

И вывод этого кода:

t
�
�
�
a

Кто-нибудь может мне помочь? Спасибо заранее.

Ответы [ 4 ]

4 голосов
/ 18 февраля 2020

Используйте комбинацию setlocale() и wstring:

Ссылка на живой образец

#include <clocale>
#include <iostream>


void test() {
    std::wstring str = L"tỏa";
    for(int i=0; i<str.length(); ++i){
        std::wcout << str[i] << std::endl;
    }
    std::wcout << "Size: " << str.size(); //the size of the string is 3 as it should
}

int main()
{   
    setlocale(LC_ALL, "");
    test();
    return 0;
}

РЕДАКТИРОВАТЬ:

Если вы хотите сохранить широкий символ в переменной, это так просто:

wchar_t ch = str[1];

Вы также можете использовать код ASCII:

wchar_t ch = 7887;

Примечание: Это может работать не во всех компиляторах во всех SO, переносимость 100% не гарантируется.

2 голосов
/ 18 февраля 2020

Символ ỏ является частью Extended Ascii (см. https://theasciicode.com.ar/extended-ascii-code/letter-o-circumflex-accent-ascii-code-226.html).

Если ваша консоль не может распознавать UTF-8, такие символы (2+ байта) ) будет представлен несколькими полями.

Возможно, вы захотите использовать std::wstring (http://www.cplusplus.com/reference/string/wstring/) для решения этой проблемы.

2 голосов
/ 18 февраля 2020

std :: string не подходит для хранения символов размером более 1 байта: "ỏ" в вашем случае.

«5» означает длину вашей строки в байтах. Потому что std :: string по-прежнему может хранить такие строки, как ваша, но так сложно обрабатывать строки.

Попробуйте использовать std :: wstring.

Вы можете прочитать здесь о широких символах: https://en.wikipedia.org/wiki/Wide_character

2 голосов
/ 18 февраля 2020

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

Если вы просто удалите std::endl, вы, вероятно, увидите свою строку. Потому что в этом случае консоль может обрабатывать строку как вывод UTF-8 (я думаю, что Linux консоль просто делает это по умолчанию).

Примечание: Для обработки UTF-8 вы может потребоваться добавить следующее в ваш код:

std::setlocale(LC_ALL, "en_US.UTF-8");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...