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?
Odpowiedz
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
Nie musisz zapisywać kodu źródłowego w UTF-8, jeśli używasz 'u8" abcdéfg "'. –
Czy ustawienia regionalne są takie ważne? Jeśli w ogóle ignorujesz ustawienia regionalne? – Viet
@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. –
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/.
Lub [Boost.Regex] (http://www.boost.org/libs/regex/). – ildjarn
@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
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.
Dopasowywanie Regex nie jest "operacją podciągu". –
- 1. Jak działają wyrażenia regularne w selen?
- 2. Jak utworzyć transakcję SWIG z ciągami utf8 w języku C#?
- 3. "Wyrażenia stałe" przed C++ 11
- 4. Haskell: Wyrażenia regularne i dane.Teksty
- 5. Dlaczego wyrażenia regularne w Javie i Perlu działają inaczej?
- 6. Wyrażenia regularne C# - czy można wyodrębnić dopasowania podczas dopasowywania?
- 7. .NET Wyrażenia regularne na bajty zamiast znaków
- 8. Wyrażenia regularne i GWT
- 9. Fuzzy Wyrażenia regularne
- 10. Empirycznie określić kategorię wartości wyrażenia C++ 11?
- 11. wyrażenia regularne case-niewrażliwy
- 12. Wyrażenia regularne kończą się
- 13. Wyrażenia regularne w OCaml
- 14. Wyrażenia regularne na interpunkcji
- 15. Skrobanie ekranu: wyrażenia regularne lub wyrażenia XQuery?
- 16. Czy można bezpiecznie czytać wyrażenia regularne z pliku?
- 17. Czy mogę "połączyć" 2 wyrażenia regularne z logiką lub?
- 18. Wyrażenia regularne w procedurach przechowywanych
- 19. Python Wyrażenia regularne na datę
- 20. Wysokowydajne, proste wyrażenia regularne Javy
- 21. Wyrażenia regularne w przypadku Elixir
- 22. Wyrażenia regularne konwertujące do diagramu
- 23. Wyrażenia regularne w zapytaniach SQLalchemy?
- 24. Wyrażenia regularne JavaScript i podfoldery
- 25. Javascript Wyrażenia regularne - zamienić znaki nienumeryczne
- 26. Wyrażenia regularne javascript jako funkcje?
- 27. Wyrażenia regularne - pasujące białe znaki
- 28. Jak działa wyrażenie regularne PowerShell z ciągami wieloliniowymi?
- 29. C++ 11 regex: sprawdzanie, czy ciąg zaczyna się od regex
- 30. Jak działają wyrażenia zapytań web2py?
Czy wykryję tutaj zamieszanie związane z kodami Unicode/kodowymi i schematami kodowania Unicode? –
http://icu-project.org/apiref/icu4c/classUnicodeString.html –