C++ 11

2014-09-27 32 views
5

'da bir UTF-8 dizgisi boyunca yineleme Bir UTF-8 dizesiyle yinelemeye çalışıyorum. Anladığım kadarıyla, UTF-8 karakterlerinin değişken uzunluğa sahip olması, bu yüzden char-by-char'ı yineleyemiyorum ama bir tür dönüşüm kullanmam gerekiyor. Bunun modern C++ 'da bunun bir işlevi olduğuna eminim ama ne olduğunu bilmiyorum. C++ 11

#include <iostream> 
#include <string> 

int main() 
{ 
    std::string text = u8"řabcdě"; 
    std::cout << text << std::endl; // Prints fine 
    std::cout << "First letter is: " << text.at(0) << text.at(1) << std::endl; // Again fine. So 'ř' is a 2 byte letter? 

    for(auto it = text.begin(); it < text.end(); it++) 
    { 
    // Obviously wrong. Outputs only ascii part of the text (a, b, c, d) correctly 
    std::cout << "Iterating: " << *it << std::endl; 
    } 
} 

Ben wchar_t okudum ve wstring kullanılmamalıdır kadarıyla clang++ -std=c++11 -stdlib=libc++ test.cpp

ile derlenmiştir.

+0

"UTF-8 karakterleri" diye bir şey yoktur. Konuya aşina olana kadar, yazım kurallarına atlamak sinir bozucu ve isteksiz olacaktır. –

+0

Bazı Unixoid'lerde veya pencerelerde misiniz? Ve kod birimleri, kod noktaları veya grafikler istiyor musunuz? (Karakter gülünç bağlam bağımlı (ve hatta karar vermek için yeterli olmayabilir), ve pencerelerde fazladan zarar var) – Deduplicator

+1

Bir göz atmak isteyebilirsiniz [burada] (http://en.cppreference.com)/ağırlık/cPP/yerel/wstring_convert/from_bytes). Unutmayın ki gcc'de çalışmıyor, henüz bu standardın bir kısmını uygulamamışlar, fakat clang/libC++ 'da çalışıyorlar ve VS2013 IIRC ile çalışmalılar. –

cevap

3

n.m. Ben std::wstring_convert kullanılan önerdi:

Belki de bu YBÜ gibi herhangi bir üçüncü parti kütüphaneleri kullanımı olmadan C++ 11 yapmak mümkün olup olmadığını bilmek istedi Söz konusu daha net belirlenmiş gerekirdi
#include <codecvt> 
#include <locale> 
#include <iostream> 
#include <string> 

int main() 
{ 
    std::u32string input = U"řabcdě"; 

    std::wstring_convert<std::codecvt_utf8<char32_t>, char32_t> converter; 

    for(char32_t c : input) 
    { 
    std::cout << converter.to_bytes(c) << std::endl; 
    } 
} 

veya UTF8 CPP.

+0

G ++ hangi sürümünü kullandınız? C++ 14 – Splash

+0

'un bir parçası olabilir clang: Apple LLVM 7.0.0 sürümünü kullanıyorum (clang-700.0.72), ama hepsi C++ 11. Http://en.cppreference.com adresinden kontrol edebilirsiniz. –

+0

http://en.cppreference.com/w/cpp/locale/codecvt_utf8 adresinde çalışıyordum ve 4.9 sürümü C++ 11'i seçtim ve bunu yapmıyor. t derleyin. Bir bakabilir misin? – Splash