2011-01-15 21 views
7

Tôi biết web chủ yếu là chuẩn hóa theo hướng UTF-8 gần đây và tôi đã tự hỏi liệu có bất kỳ nơi nào sử dụng UTF-8 sẽ là một điều xấu. Tôi đã nghe các đối số rằng UTF-8, 16, vv có thể sử dụng nhiều không gian hơn nhưng cuối cùng nó đã được không đáng kể.Có lý do nào không sử dụng UTF-8, 16, v.v. cho mọi thứ không?

Ngoài ra, những gì về trong các chương trình Windows, vỏ Linux và những thứ có tính chất đó - bạn có thể sử dụng UTF-8 một cách an toàn không?

+0

Đối với giao thức hiện tại không hỗ trợ UTF-8, đó là lý do chính đáng để không sử dụng UTF-8 :) Cá nhân tôi chỉ muốn hỗ trợ mã hóa UTF-8 vì nó cho phép ký tự unicode trong khi cho phép cuộc sống của tôi xoay quanh Ký tự ASCII-space (mở nội dung UTF-16 trong một trình soạn thảo "câm" làm cho tôi chảy máu). –

+0

@pst: B ả n h ệ i h ệ i? – dan04

Trả lời

1

Nếu có sẵn UTF-32, hãy sử dụng phiên bản này để xử lý.

Nếu nền tảng của bạn hỗ trợ Unicode UTF-32/UCS-4 nguyên bản thì phiên bản "nén" UTF-8 và UTF-16 có thể chậm hơn, vì chúng sử dụng số lượng byte khác nhau cho mỗi ký tự (chuỗi ký tự), mà làm cho không thể làm một tra cứu trực tiếp trong một chuỗi theo chỉ mục, trong khi UTF-32 sử dụng 32 bit "phẳng" cho mỗi nhân vật, tăng tốc một số hoạt động chuỗi rất nhiều. Tất nhiên, nếu bạn đang lập trình trong một môi trường rất hạn chế như hệ thống nhúng và có thể chắc chắn chỉ có các ký tự ASCII hoặc ISO 8859-x xung quanh, bao giờ, thì bạn có thể chọn các bộ ký tự đó cho hiệu quả và tốc độ. Nhưng nói chung, hãy liên kết với các định dạng chuyển đổi Unicode .

+2

UTF-32 chiếm 4x không gian của ASCII (hoặc UTF-8 khi mã hóa các ký tự ASCII) cho cùng một dữ liệu. Điều này chắc chắn có thể quan trọng. Ngoài ra, không giống như các bộ ký tự "cũ" như ISO-8859- * (và không giống như UTF-8), bạn có các vấn đề về độ dài theo thứ tự byte với UTF-32 và UTF-16. – dkarp

+0

["UTF-32 (hoặc UCS-4) là một giao thức mã hóa các ký tự Unicode sử dụng chính xác 32 bit cho mỗi điểm mã Unicode. Tất cả các định dạng chuyển đổi Unicode khác sử dụng mã hóa có độ dài thay đổi. một biểu diễn trực tiếp của codepoint của nó. "] (http://en.wikipedia.org/wiki/UTF-32/UCS-4) – dkarp

+0

@dkarp Chỉ cần kiểm tra lại và bạn nói đúng. My xấu –

0

Khi bạn cần viết chương trình (thực hiện thao tác chuỗi) cần phải rất nhanh và bạn chắc chắn rằng bạn sẽ không cần ký tự lạ, có thể là UTF-8 không phải là ý tưởng tốt nhất. Trong mọi tình huống khác, UTF-8 phải là một tiêu chuẩn.

UTF-8 hoạt động tốt trên hầu hết các phần mềm gần đây, ngay cả trên Windows.

+0

Vâng, bạn * có thể * viết phần mềm dựa trên UTF-8 trên Windows (tôi đã thực hiện nó), nhưng bạn phải tránh các chức năng như 'fopen' có chuỗi" ANSI ":-( – dan04

+0

Cái gì? Fopen? Tôi đã nói không thể viết phần mềm trên Windows dựa trên UTF-8?Tôi không hiểu ý của bạn. Hoặc có thể ai đó đã xóa bình luận của anh ấy. –

0

Điều nổi tiếng là utf-8 hoạt động tốt nhất để lưu trữ tệp và truyền tải mạng. Nhưng mọi người tranh luận liệu utf-16/32 có tốt hơn để xử lý hay không. Một đối số chính là utf-16 vẫn là độ dài thay đổi và thậm chí utf-32 vẫn không phải là một điểm mã cho mỗi ký tự, vậy chúng tốt hơn utf-8 như thế nào? Ý kiến ​​của tôi là utf-16 là một sự thỏa hiệp rất tốt.

Đầu tiên, các ký tự ở bên cạnh BMP cần mã hai điểm trong utf-16 là các mã cực kỳ hiếm khi được sử dụng. Các nhân vật Trung Quốc (cũng là một số nhân vật châu Á khác) trong phạm vi đó về cơ bản là những người chết. Những người bình thường sẽ không sử dụng chúng, ngoại trừ các chuyên gia sử dụng chúng để số hóa sách cổ. Vì vậy, utf-32 sẽ là một sự lãng phí hầu hết thời gian. Đừng lo lắng quá nhiều về những nhân vật đó, vì chúng sẽ không làm cho phần mềm của bạn trông xấu nếu bạn không xử lý chúng đúng cách, miễn là phần mềm của bạn không dành cho những người dùng đặc biệt đó.

Thứ hai, thông thường chúng ta cần phân bổ bộ nhớ chuỗi có liên quan đến số ký tự. ví dụ. cột chuỗi cơ sở dữ liệu cho 10 ký tự (giả sử chúng tôi lưu trữ chuỗi unicode ở dạng chuẩn hóa), sẽ là 20 byte cho utf-16. Trong hầu hết các trường hợp, nó sẽ hoạt động giống như vậy, ngoại trừ trường hợp cực đoan, nó sẽ chỉ có 5-8 ký tự. Nhưng đối với utf-8, độ dài byte chung của một ký tự là 1-3 đối với các ngôn ngữ phương Tây và 3-5 cho các ngôn ngữ Châu Á. Có nghĩa là chúng ta cần 10-50 byte ngay cả đối với các trường hợp thông thường. Nhiều dữ liệu hơn, xử lý nhiều hơn.

+0

Tôi không đồng ý với "Đừng lo lắng quá nhiều về những nhân vật đó, vì chúng sẽ không làm cho phần mềm của bạn trông xấu nếu bạn không xử lý chúng đúng cách". Nói "Chương trình của tôi sử dụng/hỗ trợ UTF-16" khi bạn có nghĩa là "Chương trình của tôi sử dụng/hỗ trợ một tập hợp con của UTF-16" hoặc là không trung thực hoặc một lời nói dối hoàn toàn. Lỗi là một chuyện; cố ý không hỗ trợ toàn bộ UTF-16 không phải là lỗi. – Kevin

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