2012-06-28 32 views
18

Nếu tôi muốn sử dụng biểu thức chính quy của C++ 11 với chuỗi unicode, chúng có hoạt động với char * như UTF-8 hay tôi phải chuyển đổi chúng thành chuỗi wchar_t *?Do C++ 11 biểu thức chính quy có hoạt động với chuỗi UTF-8 không?

+6

Tôi có phát hiện nhầm lẫn về các điểm mã Unicode/mã và các lược đồ mã hóa Unicode ở đây không? –

+1

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

Trả lời

11

Bạn cần kiểm tra trình biên dịch và hệ thống bạn đang sử dụng, nhưng trên lý thuyết, nó sẽ được hỗ trợ nếu hệ thống của bạn có ngôn ngữ UTF-8. Bài kiểm tra sau đây trả về đúng cho tôi trên 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; 
} 

LƯU Ý: Điều này được biên soạn trong một tệp UTF-8 được mã hóa.


Để an toàn, tôi cũng đã sử dụng chuỗi có các phiên bản hex rõ ràng. Nó cũng làm việc.

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

Cập nhậttest_unicode() vẫn làm việc cho tôi

$ 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

Bạn không cần phải lưu mã nguồn bằng UTF-8 nếu bạn sử dụng 'u8" abcdéfg "'. –

+0

Miền địa phương có quan trọng không? Nếu bạn bỏ qua ngôn ngữ ở tất cả? – Viet

+1

@Viet Luôn có một miền địa phương. Nếu bạn không thiết lập một cách rõ ràng miền địa phương bạn cần, thì regex sẽ xử lý với miền địa phương đã có từ trước. Tôi sẽ không mong đợi regex làm việc với các chuỗi UTF-8 nếu ngôn ngữ không tương thích với UTF-8. –

2

C++ 11 cụm từ thông dụng sẽ "làm việc với" UTF-8 tốt, với định nghĩa tối thiểu là "công việc". Nếu bạn muốn hỗ trợ biểu thức chính quy Unicode "hoàn thành" cho các chuỗi UTF-8, bạn sẽ tốt hơn với một thư viện hỗ trợ trực tiếp như http://www.pcre.org/.

+1

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

+2

@ildjarn: ... cần hỗ trợ [ICU] (http://site.icu-project.org/) được biên soạn, rất tiếc không phải là quy tắc trên tất cả các nền tảng và có thể hoàn toàn ab **** bắt đầu làm. ICU, tuy nhiên, có hỗ trợ RegEx của riêng mình ... – DevSolar

-2

Có họ sẽ, điều này là do thiết kế của bảng mã UTF-8. Các hoạt động chuỗi con nên hoạt động chính xác nếu chuỗi được coi là một mảng các byte chứ không phải là một mảng các điểm mã.

Xem Câu hỏi thường gặp # 18 tại đây: http://www.utf8everywhere.org/#faq.validation về cách điều này đạt được trong thiết kế mã hóa này.

+1

Kết hợp Regex không phải là "hoạt động chuỗi con". –

Các vấn đề liên quan