Trước hết, khái niệm về fullwidth (全 角) và halfwidth (半角) chỉ tồn tại cho hai loại ký tự bằng tiếng Nhật:
- Ký tự La Mã (tức là Latin)
- Katakana ký tự
Một khái niệm tương tự tồn tại cho Hàn Quốc Hangul, nhưng không phải cho Hiragana Nhật Bản, và cũng không cho Kanji.
Đối với Katakana, ký tự nửa chiều có các điểm mã Unicode riêng và được hiển thị bằng một nửa kích thước của các ký tự chiều rộng, mặc dù chúng giống hệt nhau. Ví dụ:
Độ rộng tối đa "ka": カ
Nửa độ rộng "ka": カ
ký tự kết hợp (ví dụ: với dấu như ガ) không tồn tại trong các phiên bản Nửa độ rộng; chúng phải được mã hóa dưới dạng hai ký tự riêng biệt: カ + ゙, có lẽ là lý do tại sao trong tác vụ của bạn gấp đôi số ký tự được phép cho một nửa. (Lưu ý rằng các kết hợp của hai điểm mã được coi là kết hợp ký tự và thường trả lại như một.)
Đối La Mã (tiếng Latin) ký tự, các ký tự ASCII thông thường được gọi là Nửa độ rộng, nhưng phạm vi đang Nhật Bản Unicode (cũng như các bộ ký tự đặc trưng của Nhật Bản truyền thống) cung cấp một phạm vi mã riêng cho các phiên bản fullwidth. Ví dụ:
Độ rộng tối đa: L
Nửa độ rộng: L
phiên bản Độ rộng tối đa không tồn tại cho các ký tự phi ASCII Latin có nguồn gốc từ (chẳng hạn như umlauts Đức), và cũng không cho các phiên bản có dấu. Tuy nhiên, chúng tồn tại cho các chữ số và một số ký tự dấu chấm câu.
Một lần nữa, Hiragana và Kanji không có phiên bản nửa chiều.
Để kiểm tra xem ký tự có phải là ký tự fullwidth hoặc halfwidth hay không, hãy so sánh điểm mã với phạm vi mã có liên quan.Các dãy như sau:
Nửa độ rộng Katakana: 0xff61
qua 0xff9f
Độ rộng tối đa Katakana: 0x30a0
qua 0x30ff
Nửa độ rộng La Mã: 0x21
qua 0x7e
(đây là ASCII)
Độ rộng tối đa La Mã: 0xff01
qua 0xff60
Hiragana: 0x3041
thông qua 0x309f
Kanji (tức là phạm vi ideograph thống nhất): 0x4e00
đến 0x9fcc
Dưới đây là một chương trình của Ruby đơn giản mà thực hiện việc kiểm tra trên một cơ sở cho mỗi nhân vật:
# -*- coding: utf-8 -*-
def is_halfwidth_katakana(c)
return (c.ord >= 0xff61 and c.ord <= 0xff9f)
end
def is_fullwidth_katakana(c)
return (c.ord >= 0x30a0 and c.ord <= 0x30ff)
end
def is_halfwidth_roman(c)
return (c.ord >= 0x21 and c.ord <= 0x7e)
end
def is_fullwidth_roman(c)
return (c.ord >= 0xff01 and c.ord <= 0xff60)
end
def is_hiragana(c)
return (c.ord >= 0x3041 and c.ord <= 0x309f)
end
def is_kanji(c)
return (c.ord >= 0x4e00 and c.ord <= 0x9fcc)
end
text = "Hello World、こんにちは、半角カタカナ、全角カタカナ、fullwidth 0-9\n"
text.split("").each do |c|
if is_halfwidth_katakana(c)
type = "halfwidth katakana"
elsif is_fullwidth_katakana(c)
type = "fullwidth katakana"
elsif is_halfwidth_roman(c)
type = "halfwidth roman"
elsif is_fullwidth_roman(c)
type = "fullwidth roman"
elsif is_hiragana(c)
type = "hiragana"
elsif is_kanji(c)
type = "kanji"
end
printf("%c (%x) %s\n",c,c.ord,type)
end
ghi chú Hơn nữa
Mã này dao động trên là chính thức Phạm vi Unicode cho từng loại ký tự (xem Unicode Fullwidth forms và Unicode Hiragana). Chúng bao gồm một số phiên bản fullwidth/halfwidth có các ký tự cũ/truyền thống hoặc các ký tự dấu chấm câu đặc biệt. Nếu bạn chỉ muốn các ký tự thường được sử dụng trong biểu mẫu web (ví dụ: để mọi người nhập tên của họ), bạn có thể muốn thu hẹp phạm vi một chút.
Khuyến nghị: Nếu đây là biểu mẫu web nơi mọi người có thể nhập tên của họ, bạn có thể muốn làm nhiều hơn một chút so với chỉ kiểm tra nửa chiều rộng hoặc toàn chiều rộng. Nó là cực kỳ phổ biến trên các trang web Nhật Bản và các hình thức đăng ký, đặc biệt. với các ngân hàng, yêu cầu mọi người nhập tên của họ bằng nửa đường thuần túy (thông thường cho tiếng Latinh) hoặc toàn bộ thông tin thuần túy (thường là cho Katakana). Thật không may, điều này làm cho dữ liệu nhập vào rất bất tiện. Khi phương thức nhập tiếng Nhật được bật, các ký tự Latinh thường xuất hiện trong các phiên bản fullwidth và biểu mẫu web sau đó sẽ từ chối dữ liệu vì nó không phải là halfwidth thuần túy. Thay vì từ chối, cần tự động chuyển đổi nó thành bất kỳ hình thức nào cần. Bạn có thể dễ dàng thực hiện điều này bằng cách dịch từ một phạm vi mã sang phạm vi mã khác (chỉ đơn giản bằng cách thêm hằng số liên quan), và làm cho cuộc sống của mọi người trở nên dễ dàng hơn nhiều.
Không chắc chắn các ký tự tiếng Nhật có chiều rộng một nửa và toàn bộ chiều rộng là bao nhiêu. Có điều gì đó tôi phải hiểu để trả lời câu hỏi không? –
@garbagecollection Rất có thể, vâng. [Câu trả lời này có vẻ liên quan] (http://stackoverflow.com/a/4684278/477878) ngay cả khi đó là câu trả lời về độ rộng phông chữ để điều chỉnh. –
vâng, đó là về font tôi nghĩ rằng halfwidth là tỷ lệ 2: 1 trong khi fullwidth là tỷ lệ 1: 1, tôi kiểm tra kích thước byte nhưng cả hai đều là 3 – valrecx