2016-02-02 24 views
8

ジュリア、Learn Julia in Y Minutesへの入門ガイド、インデックスUTF8文字列からユーザーを思いとどまら:JuliaでUTF8文字列の索引付けが推奨されないのはなぜですか?

# Some strings can be indexed like an array of characters 
"This is a string"[1] # => 'T' # Julia indexes from 1 
# However, this is will not work well for UTF8 strings, 
# so iterating over strings is recommended (map, for loops, etc). 

はなぜ落胆このような文字列を反復処理されますか?この代替文字列型の構造について具体的には、インデックスエラーが発生しやすいでしょうか?これはジュリア固有の落とし穴ですか、これはUTF8文字列をサポートするすべての言語にまで及んでいますか?

+1

UTF-8は、ユニコードのマルチバイトエンコーディングであるUTF-8文字列に索引付けのようなもの、またはコード単位とは対照的に文字に(長さを得るため)はO(n)(nは文字列のサイズ)操作です。そのようなことを頻繁に行う必要がある場合は、UTF32Stringを使用し、必要に応じてUTF8に/から変換する方がよいでしょう。これはジュリア固有の落とし穴ではありませんが、Python 3のようないくつかの言語は、文字列に応じて、索引付けのためのO(1)であるUnicode文字列の最適な内部表現を選ぶことができます。 –

答えて

11

UTF8では、文字が常に1バイトでエンコードされるとは限らないためです。

ドイツ語の文字列böse(evil)を例とします。 UTF8エンコーディングでこの文字列のバイトは、次のとおりです。

0x62 0xC3 0xB6 0x73 0x65 
b ö   s e 

あなたはウムラウトを見ることができるようにö 2つのバイトが必要です。

このUTF8でエンコードされた文字列を直接インデックス化すると、"böse"[4]sで、eではなくなります。

julia> for c in "böse" 
      println(c) 
     end 
b 
ö 
s 
e 

をそして、あなたが求めてきましたから、いいえ、UTF8文字列との直接バイトのインデックスの問題はジュリアに固有のものではありません。

しかし、あなたはジュリアに反復可能オブジェクトとして文字列を使用することができます。さらに、読み出し用

勧告:
http://docs.julialang.org/en/release-0.4/manual/strings/#unicode-and-utf-8

+2

また、バイトインデックスから文字インデックスに変換する 'chr2ind'を使って反復することもできます:' for i in 1:length(s); c = chr2ind(s、i); println(s [c]);終わり。 – amrods

+5

@amrodsあなたは 'graphemes'関数を使う代わりに' collect(graphemes( "böse")) 'を返します' '' '' '、' '"、 "s"、 "e"] ' – SalchiPapa

+0

@ismael知っている...ありがとう – amrods

関連する問題