2015-12-23 3 views
4

Я работаю над проектом C++, которому необходимо получить данные от unicode text. У меня проблема, что я не могу опустить unicode character. Я использую wchar_t для хранения символа Юникода, который считывается из файла в формате Юникод. После этого я использую _wcslwr, чтобы опустить строку wchar_t. Есть много случая еще не ниже, такие как:Шестнадцатеричный символ Юникода

Đ Â Ă Ê Ô Ơ Ư Ấ Ắ Ế Ố Ớ Ứ Ầ Ằ Ề Ồ Ờ Ừ Ậ Ặ Ệ Ộ Ợ Ự 

которого нижний регистр:

đ â ă ê ô ơ ư ấ ắ ế ố ớ ứ ầ ằ ề ồ ờ ừ ậ ặ ệ ộ ợ ự 

меня попробовать tolower и она до сих пор не работает.

+1

Добро пожаловать к переполнению стека !! – UmNyobe

+3

Стандартная библиотека не в состоянии сделать это правильно, вам нужна достойная библиотека. Также, имея дело с более сложными угловыми случаями, например, нижний регистр 'ß' является' ss', от одного символа до двух. Библиотека ICU довольно популярна на земле C++. –

+1

, если количество символов, которые нужно преобразовать в нижний, невелик, вы можете определить собственный собственный массив сопоставления вместо использования библиотек. – ManKeer

ответ

2

Если вы позвоните только tolower, он назовет std::tolower из заголовка clocale, который вызовет tolower только для символа ansi.

Правильная подпись должна быть:

template< class charT > 
charT tolower(charT ch, const locale& loc); 

Здесь ниже 2 версии, которая работает хорошо:

#include <iostream> 
#include <cwctype> 
#include <clocale> 
#include <algorithm> 
#include <locale> 

int main() { 
    std::setlocale(LC_ALL, ""); 
    std::wstring data = L"Đ Â Ă Ê Ô Ơ Ư Ấ Ắ Ế Ố Ớ Ứ Ầ Ằ Ề Ồ Ờ Ừ Ậ Ặ Ệ Ộ Ợ Ự"; 
    std::wcout << data << std::endl; 

    // C std::towlower 
    for(auto c: data) 
    { 
     std::wcout << static_cast<wchar_t>(std::towlower(c)); 
    } 
    std::wcout << std::endl; 

    // C++ std::tolower(charT, std::locale) 
    std::locale loc(""); 
    for(auto c: data) 
    { 
     // This is recommended 
     std::wcout << std::tolower(c, loc); 
    } 
    std::wcout << std::endl; 
    return 0; 
} 

Ссылка:

+0

Это действительно помогает мне. Большое спасибо. –