Bạn có thể không thực sự thực hiện công việc khá đúng với toLowerCase
, hoặc trên một chuỗi hoặc trong một ký tự. Vấn đề là có glyphs biến thể trong cả hai trường hợp trên hoặc dưới, và tùy thuộc vào việc bạn viết hoa hoặc viết thường glyphs của bạn có thể hoặc có thể không được bảo tồn. Nó thậm chí không rõ ràng những gì bạn có nghĩa là khi bạn nói rằng hai biến thể của một glyph trường hợp thấp hơn được so sánh bỏ qua trường hợp: là họ hoặc là họ không giống nhau? (Lưu ý rằng cũng có glyphs hỗn hợp: \u01c5, \u01c8, \u01cb, \u01f2
hoặc Dž, Lj, Nj, Dz, nhưng bất kỳ phương pháp nào được đề xuất ở đây sẽ hoạt động trên những điều đó miễn là chúng được tính giống như biến thể hoàn toàn trên hoặc dưới hoàn toàn của chúng.)
Có một vấn đề khác khi sử dụng Char
: có một số 80 điểm mã không thể đại diện với một Char
là các biến thể chữ hoa/chữ thường (40 của mỗi trường), ít nhất là được phát hiện bởi mã trên/dưới của mã Java . Do đó, bạn cần lấy các điểm mã và thay đổi trường hợp trên các mã này.
Nhưng các điểm mã không hỗ trợ biến thể glyph.
Dù sao, đây là một danh sách đầy đủ của các ký hiệu là vấn đề do các biến thể, cho thấy làm thế nào họ giá vé so với 6 phương pháp biến thể:
- Character
toLowerCase
- Character
toUpperCase
- Chuỗi
toLowerCase
- Chuỗi
toUpperCase
- Chuỗi
equalsIgnoreCase
- Character
toLowerCase(toUpperCase)
(hoặc ngược lại)
Đối với phương pháp này, S
có nghĩa là các biến thể được đối xử giống như nhau, D
nghĩa các biến thể được coi là khác nhau từ mỗi khác.
Behavior Unicode Glyphs
=========== ================================== =========
1 2 3 4 5 6 Upper Lower Var Up Var Lo Vr Lo2 U L u l l2
- - - - - - ------ ------ ------ ------ ------ - - - - -
D D D D S S \u0049 \u0069 \u0130 \u0131 I i İ ı
S D S D S S \u004b \u006b \u212a K k K
D S D S S S \u0053 \u0073 \u017f S s ſ
D S D S S S \u039c \u03bc \u00b5 Μ μ µ
S D S D S S \u00c5 \u00e5 \u212b Å å Å
D S D S S S \u0399 \u03b9 \u0345 \u1fbe Ι ι ͅ ι
D S D S S S \u0392 \u03b2 \u03d0 Β β ϐ
D S D S S S \u0395 \u03b5 \u03f5 Ε ε ϵ
D D D D S S \u0398 \u03b8 \u03f4 \u03d1 Θ θ ϴ ϑ
D S D S S S \u039a \u03ba \u03f0 Κ κ ϰ
D S D S S S \u03a0 \u03c0 \u03d6 Π π ϖ
D S D S S S \u03a1 \u03c1 \u03f1 Ρ ρ ϱ
D S D S S S \u03a3 \u03c3 \u03c2 Σ σ ς
D S D S S S \u03a6 \u03c6 \u03d5 Φ φ ϕ
S D S D S S \u03a9 \u03c9 \u2126 Ω ω Ω
D S D S S S \u1e60 \u1e61 \u1e9b Ṡ ṡ ẛ
Phức tạp hơn nữa là không có cách nào để nhận được quyền Thổ Nhĩ Kỳ I (tức là các phiên bản chấm khác với phiên bản chưa phân loại) trừ khi bạn biết bạn đang ở Thổ Nhĩ Kỳ; không có phương pháp nào trong số những phương pháp này đưa ra hành vi đúng và không thể trừ khi bạn biết ngôn ngữ (ví dụ: không phải Thổ Nhĩ Kỳ: i
và I
là trường hợp bỏ qua tương tự; tiếng Thổ Nhĩ Kỳ, không).
Nhìn chung, sử dụng toUpperCase
cung cấp cho bạn xấp xỉ gần nhất, vì bạn chỉ có năm biến thể chữ hoa (hoặc bốn, không tính tiếng Thổ Nhĩ Kỳ).
Bạn cũng có thể cố gắng chặn riêng năm trường hợp phiền hà đó và gọi toUpperCase(toLowerCase(c))
trên chúng một mình. Nếu bạn chọn bảo vệ cẩn thận (chỉ toUpperCase
nếu c < 0x130 || c > 0x212B
, sau đó làm việc thông qua các lựa chọn thay thế khác), bạn chỉ có thể nhận được hình phạt tốc độ ~ 20% cho các ký tự trong phạm vi thấp (so với ~ 4x nếu bạn chuyển đổi các ký tự đơn thành chuỗi và equalsIgnoreCase
chúng) và chỉ khoảng một hình phạt 2x nếu bạn có rất nhiều trong khu vực nguy hiểm. Bạn vẫn có vấn đề về miền địa phương với chấm chấm I
, nhưng nếu không bạn có hình dạng tốt. Tất nhiên nếu bạn có thể sử dụng equalsIgnoreCase
trên một chuỗi lớn hơn, bạn nên làm điều đó.
Đây là mẫu mã Scala mà không được công việc:
def elevateCase(c: Char): Char = {
if (c < 0x130 || c > 0x212B) Character.toUpperCase(c)
else if (c == 0x130 || c == 0x3F4 || c == 0x2126 || c >= 0x212A)
Character.toUpperCase(Character.toLowerCase(c))
else Character.toUpperCase(c)
}
bạn có thể sử dụng 'Character.toLowerCase' hoặc' Character.toUpperCase' để chuyển tất cả thành chữ thường hoặc chữ thường và so sánh nó. – idiottiger
@idiottiger Làm việc bằng tiếng Anh, nhưng không phải bằng mọi ngôn ngữ. –