2010-12-11 5 views
2

Comment utiliser les méthodes String sur les caractères UTF-8? Par exemple, j'ai une chaîne avec des caractères cyrilliques, donc quand j'utilise string.upcase cela ne fonctionne pas.Comment utiliser les méthodes String sur les caractères UTF-8?

+0

Veuillez nous dire si vous utilisez 1.8 ou 1.9, le comportement a changé de manière significative en 1.9 en ce qui concerne la manipulation des encodages. Dans 1.8 chaînes étaient des tableaux d'octets, dans 1.9 ils sont des tableaux de caractères. – Theo

Répondre

7

Les rails active_support gem possède des extensions de chaîne qui peuvent gérer cela.

Par exemple:

# $ sudo gem install activesupport 
require 'active_support/core_ext/string' 
'Laurent, où sont les tests ?'.mb_chars.upcase.to_s 
# outputs => "LAURENT, OÙ SONT LES TESTS ?" 
+0

Cela ne fonctionne pas pour les caractères cyrilliques met "ТОВА Е ТЕСТ" .downcase => "ТОВА Е ТЕСТ" –

8

Ruby ne supporte que des conversions de cas sur les lettres AZ et az. La raison de ceci est simplement que les conversions de cas pour d'autres lettres ne sont pas bien définies. Par exemple, en turc 'I'.downcase # => 'ı' et 'i'.upcase # => 'İ', mais en français 'I'.downcase # => 'i' et 'i'.upcase # => 'I'. Ruby devrait connaître non seulement l'encodage des caractères, mais aussi le langage pour le faire correctement.

Pire encore, en allemand

'MASSE'.downcase 

est soit

'maße' # "measurements" 
'masse' # "mass" 

En d'autres termes: vous devez réellement comprendre le texte, à savoir que vous avez besoin d'une AI entière, faire les conversions de cas correctement.

Et moi-même ai effectivement accidentellement construit une phrase une fois, qui était indécidable même pour un humain.

En bref: c'est tout simplement impossible à faire correctement, c'est pourquoi Ruby ne le fait pas . Cependant, il existe des bibliothèques tierces, comme la bibliothèque Unicode et ActiveSupport, qui prennent en charge un sous-ensemble un peu plus grand de caractères.

+0

İyi cevap, Jörg. –

0
"ТЕКСТ".mb_chars.downcase # => "текст" 
0

Malheureusement, il n'y a pas de support pour downcase/upcase dans Ruby 1.9, étant donné les problèmes décrits dans d'autres publications. Encore vous pouvez écrire votre propre gemme, cela ajoutera le support pour cyrillic. Vous pouvez regarder mon gem for Polish - tourner le pliage en charge des cas est aussi facile que:

gem 'string_case_pl' 

Il fournit également la chaîne de tri appropriée pour le polonais.

Questions connexes