Trong UTF-8 mã hóa số byte thực hiện cho một nhân vật được xác định bởi các byte đầu tiên của nhân vật đó, theo bảng sau (lấy từ RFC 3629:
Char. number range | UTF-8 octet sequence
(hexadecimal) | (binary)
--------------------+---------------------------------------------
0000 0000-0000 007F | 0xxxxxxx
0000 0080-0000 07FF | 110xxxxx 10xxxxxx
0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
Nếu các bit cao nhất byte đầu tiên là "0", sau đó ký tự chỉ có một byte. Nếu các bit cao nhất là "110" thì ký tự có 2 byte và cứ thế.
Những gì bạn có thể làm là đọc một byte từ tệp và xác định số lượng byte tiếp tục bạn cần đọc cho toàn bộ ký tự UTF-8:
function get_one_utf8_character(file)
local c1 = file:read(1)
if not c1 then return nil end
local ncont
if c1:match("[\000-\127]") then ncont = 0
elseif c1:match("[\192-\223]") then ncont = 1
elseif c1:match("[\224-\239]") then ncont = 2
elseif c1:match("[\240-\247]") then ncont = 3
else
return nil, "invalid leading byte"
end
local bytes = { c1 }
for i=1,ncont do
local ci = file:read(1)
if not (ci and ci:match("[\128-\191]")) then
return nil, "expected continuation byte"
end
bytes[#bytes+1] = ci
end
return table.concat(bytes)
end
Một cách khá đơn giản nhưng chắc chắn không phải cách rất phổ biến là thực sự "phân tích cú pháp byte (1..6) và chuyển đổi chúng thành giá trị UTF-32". Sử dụng UTF-32 có thể làm cho công cụ dễ dàng hơn trong một số trường hợp, tùy thuộc vào những gì bạn sẽ làm. – BitTickler
Thực hiện chức năng nào khi đọc một ký tự một cách thủ công? Mặc dù điều đó sẽ kết thúc bạn có đọc thêm một nhân vật sau đó bạn cần thiết vì vậy bạn sẽ cần phải tua lại. –
im sẽ tạo ra hiệu chỉnh kiểu chữ (có thể đọc thêm các ký tự tiếng Séc), vì vậy tôi sẽ đọc tập tin đầu vào, tìm lỗi và sửa nó. Nhưng nó không thể làm việc với (cho Lua nhân vật không rõ). Văn bản gốc: ľúbozvučně řeřicha čučoridka ľaľia Văn bản được đọc bởi Lua (trong Zero Brane Studio): [link] (http://i.imgur.com/PcorbzP.png) khi tôi so sánh chữ cái đầu tiên của cả hai, nó không khớp với – Hrablicky