2016-02-02 17 views
8

Hướng dẫn giới thiệu đến Julia, Learn Julia in Y Minutes, không khuyến khích người dùng từ chuỗi indexing UTF8:Tại sao việc lập chỉ mục chuỗi UTF8 không được khuyến khích ở Julia?

# 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). 

Tại sao iterating trên dây như nản chí? Điều gì đặc biệt về cấu trúc của loại chuỗi thay thế này làm cho việc lập chỉ mục bị lỗi? Đây có phải là lỗ hổng cụ thể của Julia hay không, điều này có mở rộng đến tất cả các ngôn ngữ có hỗ trợ chuỗi UTF8 không?

+1

Kể từ UTF-8 là một mã hóa đa byte của Unicode, những thứ như lập chỉ mục vào một chuỗi UTF-8, hoặc nhận được chiều dài (bằng ký tự như trái ngược với mã đơn vị) là hoạt động O (n) (trong đó n là kích thước của chuỗi). Nếu bạn cần phải làm những việc như vậy thường xuyên, bạn nên sử dụng UTF32String và chuyển đổi sang/từ UTF8 nếu cần. Đây không phải là một lỗ hổng cụ thể của Julia, nhưng một số ngôn ngữ như Python 3 có thể chọn biểu diễn nội bộ tốt nhất cho chuỗi Unicode, vẫn là O (1) để lập chỉ mục, tùy thuộc vào chuỗi. –

Trả lời

11

Bởi vì trong UTF8, một ký tự không phải lúc nào cũng được mã hóa trong một byte đơn.

Lấy ví dụ: chuỗi ngôn ngữ tiếng Đức böse (ác). Các byte của chuỗi này trong mã hóa UTF8 là:

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

Như bạn có thể thấy âm sắc ö yêu cầu 2 byte.

Bây giờ, nếu bạn trực tiếp lập chỉ mục chuỗi được mã hóa UTF8 này "böse"[4] sẽ cung cấp cho bạn s và không e.

Tuy nhiên, bạn có thể sử dụng chuỗi như một đối tượng iterable trong julia:

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

Và vì bạn đã hỏi, Không, vấn đề byte indexing trực tiếp với chuỗi UTF8 là không cụ thể cho Julia.

Khuyến nghị để đọc thêm:
http://docs.julialang.org/en/release-0.4/manual/strings/#unicode-and-utf-8

+2

bạn cũng có thể lặp lại bằng cách sử dụng 'chr2ind' chuyển đổi từ chỉ mục byte thành chỉ mục ký tự:' cho i trong 1: độ dài (s); c = chr2ind (s, i); println (s [c]); kết thúc'. – amrods

+5

@amrods bạn có thể sử dụng hàm 'graphemes' thay vào đó:' collect (graphemes ("böse")) 'trả về' ["b", "ö", "s", "e"] ' – SalchiPapa

+0

@ismael rất hay biết ... cảm ơn – amrods

Các vấn đề liên quan