2016-04-02 9 views
1

クラシックRubyの実装では、Unicode文字を反復することができます:すべてのUnicode文字と範囲を必要

('a'..'z').to_a 
# ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z"] 
('@'..'[').to_a 
# ["@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "["] 

私は、すべてのUnicode文字(異なるロケール、句読点など)との配列を取得する必要があります。それ、どうやったら出来るの?私は最初と最後の文字を知らない。

+3

「すべてのユニコード文字」が広すぎます。正確に何が必要ですか?手紙?たとえば、「★」はユニコード文字です。それが必要ですか? – mudasobwa

+0

@mudasobwa英語とキリル文字のロケール(他のロケールも便利です)、数字、句読点が必要です。 – DreamWalker

+2

範囲は常に連続的ではありません – YOU

答えて

0
[*32..65535].map do |e| 
    e.chr(Encoding::UTF_8).tap do |char| 
    char =~ /\p{Alnum}|\p{Punct}/ || raise 
    end rescue nil # rescuing both conversion and self-raised 
end.compact 

すべてのコードポイントを介して上記反復、alphanumerics and punctuationを選択します。

NB上記アプローチ、発音区別符号と一致するように多かれ少なかれ堅牢、failesあるが、それは、C又はOのような合成文字の一部です。

+0

あなたのコードはすべてのコードポイントの〜5%を反復処理します。 –

+0

@一二三はい、そうですか?ライブアルファベットはすべてそこに住んでいます。または私は間違っていますか? – mudasobwa

+0

Unicodeは[100,000コードポイント](http://unicode.org/cldr/utility/list-unicodeset.jsp?a= [:alnum = Yes:])を英数字で分類します。 –

1
[*32..65535]. 
    pack("U*"). 
    encode('UTF-8', invalid: :replace, undef: :replace, replace: ''). 
    split('') 

irb(main):070:0> [*32..65535].pack("U*").encode('UTF-8', invalid: :replace, undef: :replace, replace: '').split('')
=> [" ", "!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "\u007F", "\u0080", "\u0081", "\u0082", "\u0083", "\u0084", "\u0085", "\u0086", "\u0087", "\u0088",
...
"\uFFEA", "\uFFEB", "\uFFEC", "\uFFED", "\uFFEE", "\uFFEF", "\uFFF0", "\uFFF1", "\uFFF2", "\uFFF3", "\uFFF4", "\uFFF5", "\uFFF6", "\uFFF7", "\uFFF8", "\uFFF9", "\uFFFA", "\uFFFB", "\uFFFC", "\uFFFD", "\uFFFE", "\uFFFF"]

#pack
#encode
#split


(すべてのコードポイントでは動作しません...)

(32..127).map {|i| i.chr(Encoding::UTF_8)} 

しかし、127を65535に置き換えてください。スクロールをお楽しみください!

irb(main):011:0> (32..127).map {|i| i.chr}
=> [" ", "!", "\"", "#", "$", "%", "&", "'", "(", ")", "*", "+", ",", "-", ".", "/", "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", ":", ";", "<", "=", ">", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", "\x7F"]

+0

'55296.chr(Encoding :: UTF_8)'⇒ 'RangeError:UTF-8で無効なコードポイント0xD800' – mudasobwa

+1

hmmm ... '(32..0xFFFF).map {| i | i.chr(Encoding :: UTF_8)rescue nil} .compact ' – Yacine

1

解析UnicodeData.txtを通じて

が範囲に一定の注意を払って(フィールドTR44#Property Definitionsで説明):

3400 <CJK Ideograph Extension A, First> 
4DB5 <CJK Ideograph Extension A, Last> 
4E00 <CJK Ideograph, First> 
9FD5 <CJK Ideograph, Last> 
AC00 <Hangul Syllable, First> 
D7A3 <Hangul Syllable, Last> 
D800 <Non Private Use High Surrogate, First> 
DB7F <Non Private Use High Surrogate, Last> 
DB80 <Private Use High Surrogate, First> 
DBFF <Private Use High Surrogate, Last> 
DC00 <Low Surrogate, First> 
DFFF <Low Surrogate, Last> 
E000 <Private Use, First> 
F8FF <Private Use, Last> 
20000 <CJK Ideograph Extension B, First> 
2A6D6 <CJK Ideograph Extension B, Last> 
2A700 <CJK Ideograph Extension C, First> 
2B734 <CJK Ideograph Extension C, Last> 
2B740 <CJK Ideograph Extension D, First> 
2B81D <CJK Ideograph Extension D, Last> 
2B820 <CJK Ideograph Extension E, First> 
2CEA1 <CJK Ideograph Extension E, Last> 
F0000 <Plane 15 Private Use, First> 
FFFFD <Plane 15 Private Use, Last> 
100000 <Plane 16 Private Use, First> 
10FFFD <Plane 16 Private Use, Last> 

それはあなたが反復かどうか、についてのデータを必要とするものに依存それらの範囲。

関連する問題