2012-06-28 13 views
18

Si quiero usar las expresiones regulares de C++ 11 con cadenas unicode, ¿funcionarán con char * como UTF-8 o tendré que convertirlas a una cadena wchar_t *?¿Las expresiones regulares de C++ 11 funcionan con cadenas UTF-8?

+6

¿Detecto una confusión acerca de los puntos Unicode/code y los esquemas de codificación de Unicode aquí? –

+1

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

Respuesta

11

Debería probar su compilador y el sistema que está utilizando, pero, en teoría, será compatible si su sistema tiene una configuración regional UTF-8. La prueba siguiente volvió cierto para mí en 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; 
} 

NOTA: Este fue compilado en un archivo de lo que era codificación UTF-8.


Solo para estar seguro, también usé una cadena con las versiones hexadecimales explícitas. Funcionó también.

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; 
} 

actualizacióntest_unicode() todavía funciona para mí

$ 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

No necesita guardar el código fuente en UTF-8 si usa 'u8" abcdéfg "'. –

+0

¿Es tan importante la configuración regional? Si ignoras la locale en absoluto? – Viet

+1

@Viet Siempre hay una configuración regional. Si no establece explícitamente la configuración regional que necesita, entonces regex procesará con la configuración regional preexistente. No esperaría que la expresión regular funcione con cadenas UTF-8 si la configuración regional no es compatible con UTF-8. –

2

C++ 11 expresiones regulares "funcionan con" UTF-8 muy bien, para una definición mínima de "trabajo". Si quieres compatibilidad con expresiones regulares Unicode "completas" para cadenas UTF-8, estarás mejor con una biblioteca que admita eso directamente, como http://www.pcre.org/.

+1

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

+2

@ildjarn: ... que necesita [ICU] (http://site.icu-project.org/) soporte compilado, que desafortunadamente no es la regla en todas las plataformas, y puede ser bastante ab **** para Ponte a trabajar. ICU, sin embargo, tiene soporte para RegEx propio ... – DevSolar

-2

Sí lo harán, esto es por diseño de la codificación UTF-8. Las operaciones de subcadena deberían funcionar correctamente si la cadena se trata como una matriz de bytes en lugar de una matriz de puntos de código.

Consulte la Pregunta frecuente n. ° 18 aquí: http://www.utf8everywhere.org/#faq.validation acerca de cómo se logra esto en el diseño de esta codificación.

+1

La coincidencia de expresiones regulares no es una "operación de subcadena". –

Cuestiones relacionadas