2012-06-28 10 views
18

Jeśli chcę używać wyrażeń regularnych C++ 11 z ciągami znaków Unicode, czy będą one działać z char * jako UTF-8, czy też muszę je przekonwertować na ciąg wchar_t *?Czy wyrażenia regularne C++ 11 działają z ciągami UTF-8?

+6

Czy wykryję tutaj zamieszanie związane z kodami Unicode/kodowymi i schematami kodowania Unicode? –

+1

http://icu-project.org/apiref/icu4c/classUnicodeString.html –

Odpowiedz

11

Będziesz musiał przetestować swój kompilator i system, którego używasz, ale teoretycznie będzie on obsługiwany, jeśli twój system ma locale UTF-8. Następujący test powrócił prawdziwy dla mnie na Clang/OS X.

bool test_unicode() 
{ 
    std::locale old; 
    std::locale::global(std::locale("en_US.UTF-8")); 

    std::regex pattern("[[:alpha:]]+", std::regex_constants::extended); 
    bool result = std::regex_match(std::string("abcdéfg"), pattern); 

    std::locale::global(old); 

    return result; 
} 

UWAGA: Ten został skompilowany w pliku, co było kodowanie UTF-8.


Po to, aby być bezpiecznym, użyłem również struny z wyraźnymi wersjami szesnastkowymi. To działało również.

bool test_unicode2() 
{ 
    std::locale old; 
    std::locale::global(std::locale("en_US.UTF-8")); 

    std::regex pattern("[[:alpha:]]+", std::regex_constants::extended); 
    bool result = std::regex_match(std::string("abcd\xC3\xA9""fg"), pattern); 

    std::locale::global(old); 

    return result; 
} 

Aktualizacjatest_unicode() nadal pracuje dla mnie

$ file regex-test.cpp 
regex-test.cpp: UTF-8 Unicode c program text 

$ g++ --version 
Configured with: --prefix=/Applications/Xcode-8.2.1.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++/4.2.1 
Apple LLVM version 8.0.0 (clang-800.0.42.1) 
Target: x86_64-apple-darwin15.6.0 
Thread model: posix 
InstalledDir: /Applications/Xcode-8.2.1.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin 
+2

Nie musisz zapisywać kodu źródłowego w UTF-8, jeśli używasz 'u8" abcdéfg "'. –

+0

Czy ustawienia regionalne są takie ważne? Jeśli w ogóle ignorujesz ustawienia regionalne? – Viet

+1

@Viet Zawsze jest lokalizacja. Jeśli nie określisz bezpośrednio wymaganego ustawienia narodowego, regex przetworzy istniejący region. Nie oczekuję, że regex będzie działał z ciągami UTF-8, jeśli ustawienia regionalne nie są zgodne z UTF-8. –

2

Wyrażenia regularne w C++ 11 będą działać poprawnie z UTF-8, dla minimalnej definicji "pracy". Jeśli chcesz "kompletnego" wyrażenia regularnego Unicode dla ciągów UTF-8, lepiej będzie z biblioteką, która obsługuje je bezpośrednio, takie jak http://www.pcre.org/.

+1

Lub [Boost.Regex] (http://www.boost.org/libs/regex/). – ildjarn

+2

@ildjarn: ... która wymaga skompilowanej obsługi [ICU] (http://site.icu-project.org/), co niestety nie jest regułą na wszystkich platformach i może być dość ab **** zabrać się do pracy. ICU ma jednak obsługę RegEx własnego ... – DevSolar

-2

Tak oni będą, to jest projekt kodowania UTF-8. Operacje podłańcucha powinny działać poprawnie, jeśli ciąg jest traktowany jako tablica bajtów, a nie tablica punktów kodowych.

Zobacz FAQ # 18 tutaj: http://www.utf8everywhere.org/#faq.validation o tym, jak osiąga się to w projekcie tego kodowania.

+1

Dopasowywanie Regex nie jest "operacją podciągu". –

Powiązane problemy