2014-06-30 28 views
8

Bir kez daha basit soru: std::string olması, karakterlerinin hangilerinin dili ve bölgesel ayarları (yerel ayar) ile ilgili rakam, sembol, beyaz boşluk vb. Olduğunu belirler. Ben ayrıca ch bir rakam veya bir simge veya başka bir şey olup olmadığını belirlemek için herhangi bir yol göremiyorum, ancakKarakter sınıflandırması

std::string text = u8"生きるか死ぬか"; 

boost::locale::boundary::segment_index<std::string::const_iterator> characters(
    boost::locale::boundary::character, 
    text.begin(), text.end(), 
    boost::locale::generator()("ja_JP.UTF-8")); 

for (const auto& ch : characters) { 
    // each 'ch' is a single character in japanese language 
} 

:

Ben boost locale boundary analysis tool kullanarak karakter kümesi içine dize bölmek başardı. boost string classification algorithms var, ancak bunlar *segment_index::iterator ile çalışıyor.

Ne de char veya wchar_t bir içine artırmak segmentini dönüştürmek mümkün olup olmadığını ben emin olduğum için, std::isalpha(std::locale) uygulayabilirsiniz.

Sembolleri sınıflandırmak için herhangi bir temiz yol var mı?

+2

Her zamanki gibi: kim, aşağılayıcı: neden? Sorunun nesi var? Doğru cevabı kesinlikle biliyor musunuz? – Ixanezis

+0

Yanılmıyorsam, 'ch' türünde 'segment ', ve bir çift yineleyici tarafından oluşturulur. Yani 'ch' bir karakteri sınırlamak için 'metin' üzerindeki yineleyici çiftini içerir. Sınıflandırma işlevleri sadece bir "char_type" değeri gerektirdiğinden ve çok baytlı karakterler kullandığınızdan, her segmenti yalnızca bir karakterden oluşan bir widechar dizesine (dizede aranan değilse) dönüştürüp ardından classify işlevini kullanabilirsiniz. Mantıklı mı? – Gonmator

+0

@Gonmator: Eğer sizi doğru anladıysam, 'std :: string' 'i bir 'std :: wstring'' e çevirmeyi ve' str [0 'varsayarak 'isdigit (str [0])' komutunu kullanmanız önerilir. ] şimdi tek geniş bir karakter anlamına geliyor. Yanılmıyorsam, bu kodun doğru çalışması için şansı artırır, ancak hala tek bir "wchar_t" ile temsil edilemeyen semboller vardır, örn. "שָלוֹם" içinde. Eğer buna güvenirsem, sınır analizini artırabilirim ve her zaman geniş-karakterli bir dizge varsa str [0] 'ı kullanabilirim. – Ixanezis

cevap

3

çalışmaz <locale> bu destekleyici işlevleri ve çok sayıda nesnenin ama ... Bir baytlı kodlama UTF-8, gibi görünüyor vermek örnek metin ve <locale> fonksiyon vardır çok baytlı kodlamalar.

ICU kitaplığını almanızı ve kullanmanızı öneririm. Diğer şeyleri arasında, Unicode Karakter Veritabanı'nda tanımlanan tüm özelliklerin test edilmesine izin verir. Aynı zamanda, bir dize (veya en az char dizisi), bir UTF_32 kod noktasını bir kerede ayıklamak için makroları veya işlevleri 'a sahiptir ( 'u test etmek istediğiniz).

+0

Teşekkürler. Ben 'boost :: locale' bir şekilde arıyoruz işlevselliği sağlar düşünüyorum, çünkü ICU kullanır içinde varsayılan olarak. Ve dahası, tek bir UTF32 kod noktasını ayıklamak istediğim şeydir, çünkü destekleyici kitaplık belgelerinin durumları gibi, birkaç UTF32 kod noktasından oluşan semboller vardır. – Ixanezis

İlgili konular