Mã nguồn của tôi có nên ở UTF-8 không?


10

Tôi cảm thấy rằng thường thì bạn không thực sự chọn định dạng mã của mình. Ý tôi là hầu hết các công cụ của tôi trong quá khứ đã quyết định cho tôi. Hoặc tôi thậm chí không nghĩ về nó. Tôi đã sử dụng TextPad trên windows vào một ngày khác và khi tôi đang lưu một tệp, nó đã nhắc tôi về ASCII, UTF-8/16, Unicode, v.v.

Tôi giả định rằng hầu hết tất cả các mã được viết là ASCII, nhưng tại sao nó phải là ASCII? Chúng ta thực sự nên sử dụng các tệp UTF-8 ngay bây giờ cho mã nguồn, và tại sao? Tôi tưởng tượng điều này có thể hữu ích cho các nhóm đa ngôn ngữ. Có các tiêu chuẩn liên quan đến cách các nhóm đa ngôn ngữ đặt tên biến / hàm / vv không?


6
Tôi viết tất cả các mã của tôi trong Klingon, bạn vô cảm!

5
@JackManey: Đây không phải là /. bạn vô cảm!
Thất vọngWithFormsDesigner

Và tập lệnh Klingon không phải là Unicode, vì vậy bạn cần sử dụng các ký tự "sử dụng riêng" hoặc phiên âm ASCII.
dan04

@ dan04: Klingon có phần sử dụng giả tiêu chuẩn cho phần sử dụng riêng của BMP (xem sổ đăng ký ConScript ) :-)
Ross Patterson

Xem thêm các đối số tại đây: utf8everywhere.org
Rory Hunter

Câu trả lời:


23

Sự lựa chọn không nằm giữa ASCII và UTF-8. ASCII là mã hóa 7 bit và UTF-8 thay thế nó - bất kỳ văn bản ASCII hợp lệ nào cũng là UTF-8 hợp lệ. Các vấn đề phát sinh khi bạn sử dụng các ký tự không phải ASCII; đối với những điều này, bạn phải chọn giữa UTF-8, UTF-16, UTF-32 và các bảng mã 8 bit khác nhau (ISO-xxxx, v.v.).

Giải pháp tốt nhất là gắn bó với bộ ký tự ASCII nghiêm ngặt, nghĩa là, không sử dụng bất kỳ ký tự không phải ASCII nào trong mã của bạn. Hầu hết các ngôn ngữ lập trình cung cấp các cách để thể hiện các ký tự không phải ASCII bằng các ký tự ASCII, ví dụ: "\u1234"để chỉ ra điểm mã Unicode ở 1234. Đặc biệt, tránh sử dụng các ký tự không phải ASCII cho mã định danh. Ngay cả khi chúng hoạt động chính xác, những người sử dụng bố cục bàn phím khác sẽ chửi bạn vì đã khiến họ gõ những ký tự này.

Nếu bạn không thể tránh các ký tự không phải ASCII, UTF-8 là lựa chọn tốt nhất của bạn. Không giống như UTF-16 và UTF-32, nó là siêu ký tự của ASCII, có nghĩa là bất kỳ ai mở nó với mã hóa sai đều nhận được ít nhất là đúng; và không giống như các bản mã 8 bit, nó có thể mã hóa về mọi ký tự mà bạn cần, rõ ràng và nó có sẵn trên mọi hệ thống, bất kể ngôn ngữ.

Và sau đó bạn có mã hóa mà mã của bạn xử lý; điều này không phải giống như mã hóa tệp nguồn của bạn. Ví dụ, tôi có thể dễ dàng viết PHP bằng UTF-8, nhưng đặt mã hóa đa bào bên trong của nó thành Latin, 1; bởi vì trình phân tích cú pháp PHP hoàn toàn không liên quan đến mã hóa, mà chỉ đọc các chuỗi byte, nên các chuỗi ký tự UTF-8 của tôi sẽ bị hiểu sai thành tiếng Latin-1. Nếu tôi xuất các chuỗi này trên thiết bị đầu cuối UTF-8, bạn sẽ không thấy bất kỳ sự khác biệt nào, nhưng độ dài chuỗi và các hoạt động đa nhân khác (ví dụ substr) sẽ tạo ra kết quả sai.

Nguyên tắc nhỏ của tôi là sử dụng UTF-8 cho mọi thứ; chỉ khi bạn hoàn toàn phải xử lý các mã hóa khác, hãy chuyển đổi sang UTF-8 càng sớm càng tốt và từ UTF-8 càng muộn càng tốt.


6

Hầu hết các IDE sẽ mặc định lưu với mã hóa UTF-8 và bạn gần như chắc chắn nên chọn UTF-8 thay vì ASCII khi được cung cấp tùy chọn. Điều này sẽ đảm bảo bạn không gặp phải vấn đề kỳ lạ với mã quốc tế hóa.


2
Bạn đang làm như thể ASCII so với UTF-8 là một lựa chọn. Khi có các ký tự không phải ASCII trong một tệp, thì không. Khi chỉ có các ký tự ASCII, UTF-8 ASCII.
Fred Foo

Tôi ước Eclipse sẽ tuân thủ điều này. Là một sinh viên CS-ish năm đầu tiên, chúa tôi đã gây ra nhiều vấn đề đau đầu khi làm việc theo nhóm, nơi có sự hiện diện của người dùng OS X, Windows và Linux. (Để tham khảo nó mặc định là macroman trên OS X, CP-1252 trên Windows và tôi quên cái nào trên Linux, nhưng bạn đặt cược cho bạn một khác nhau của nó.)
leflings

@leflings - có thể là mã hóa môi trường mặc định mà hiện tại thường là UTF-8.
Maciej Piechotka

1

Có thể nhập văn bản đơn giản vào các chuỗi hoặc ký tự được trích dẫn trong mã nguồn và có thể thấy ký tự thực tế là rất tốt. Ví dụ: ký hiệu pi 'π' hoặc chữ tượng hình '𠀊' đẹp hơn nhiều so với '\ u3c0' tương đương cho pi và L '\ u2000A' cho chữ tượng hình.

Có thể nhập và / hoặc sao chép và dán các ký tự này trực tiếp vào mã nguồn, giống như bạn làm các ký tự ASCII, trong một trình soạn thảo phong nha.

Tôi thấy các ví dụ cụ thể hữu ích trong việc khái niệm hóa và hiểu những điều mà các mô tả từ đôi khi dường như không lái xe về nhà. Khái niệm các hằng ký tự Unicode được nhập vào mã nguồn, chẳng hạn như đoạn mã ví dụ ngắn gọn sau đây:

const unsigned char  ASCII_0X7E      = (unsigned char)  '~';
const unsigned short UNICODE_0X3C0   = (unsigned short) 'π';
const unsigned long  UNICODE_0X2000A = (unsigned long)  '𠀊';
const unsigned long  UNICODE_0X2893D = (unsigned long)  '𨤽';

Ký tự dấu ngã ASCII '~' có thể được lưu trong tệp nguồn ASCII hoặc UTF-8, nhưng các ký tự Unicode không thể được lưu trữ ở dạng ASCII. Ký hiệu PI 'π' là điểm mã Unicode 0x3c0 và có thể được lưu trữ ở dạng UTF-8 dưới dạng giá trị hai byte 0xcf, 0x80. Các Ideograph tại mã Unicode điểm 0x2000a và 0x2893d yêu cầu các chuỗi UTF-8 4 byte.

Để các ký tự đó giữ lại các giá trị dự định của chúng và trình biên dịch diễn giải chúng theo dự định, mã nguồn cần được lưu theo định dạng hỗ trợ bộ ký tự Unicode, chẳng hạn như UTF-8 hoặc UTF-16. Nếu được lưu dưới dạng UTF-8, một trình biên dịch đàng hoàng sẽ hiểu và diễn giải các giá trị như dự định và một trình soạn thảo đàng hoàng sẽ tải và hiển thị các ký tự chính xác.

Như những người khác đã chỉ ra, nếu bạn đơn giản không có bất kỳ ký tự nào trong mã nguồn nằm ngoài phạm vi ASCII, thì việc lưu dưới dạng UTF-8 sẽ dẫn đến một tệp không khác gì lưu tệp ASCII, vì UTF- 8 được thiết kế để chồng lấp ASCII trong phạm vi ký tự ASCII. Ngay khi bạn nhập bất kỳ ký tự nào vào mã nguồn nằm ngoài phạm vi ASCII, một trình soạn thảo đàng hoàng sẽ thông báo cho bạn rằng bạn phải chọn một mã hóa để sử dụng để lưu tệp. UTF-8 là một lựa chọn tốt vì nó có thể xử lý ASCII như và hầu như mọi nhân vật khác được hỗ trợ trong môi trường phát triển của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.