Tại nơi làm việc, dường như không có tuần nào trôi qua mà không có một số thông tin liên quan đến mã hóa, tai họa hoặc thảm họa. Vấn đề thường bắt nguồn từ các lập trình viên nghĩ rằng họ có thể xử lý một cách đáng tin cậy tệp “văn bản” mà không cần chỉ định mã hóa. Nhưng bạn không thể.
Vì vậy, từ đó nó đã được quyết định cấm các tệp có tên kết thúc bằng *.txt
hoặc *.text
. Suy nghĩ là những phần mở rộng đó đánh lừa lập trình viên bình thường thành một sự tự mãn buồn tẻ liên quan đến mã hóa, và điều này dẫn đến việc xử lý không đúng cách. Hầu như sẽ tốt hơn nếu không có phần mở rộng nào cả, bởi vì ít nhất khi đó bạn biết rằng bạn không biết mình có gì.
Tuy nhiên, chúng tôi không muốn đi xa như vậy. Thay vào đó, bạn sẽ phải sử dụng tên tệp kết thúc bằng mã hóa. Vì vậy, cho các tập tin văn bản, ví dụ, đây sẽ là một cái gì đó giống như README.ascii
, README.latin1
,README.utf8
vv
Đối với các tệp yêu cầu một phần mở rộng cụ thể, nếu người ta có thể chỉ định mã hóa bên trong chính tệp đó, chẳng hạn như trong Perl hoặc Python, thì bạn sẽ làm điều đó. Đối với các tệp như nguồn Java mà không có cơ sở nào như vậy tồn tại bên trong tệp, bạn sẽ đặt mã hóa trước phần mở rộng, chẳng hạn nhưSomeClass-utf8.java
.
Đối với đầu ra, UTF-8 phải mạnh mẽ ưa thích.
Nhưng đối với đầu vào, chúng ta cần tìm ra cách xử lý hàng nghìn tệp trong cơ sở mã của chúng ta có tên *.txt
. Chúng tôi muốn đổi tên tất cả chúng để phù hợp với tiêu chuẩn mới của chúng tôi. Nhưng chúng ta không thể nhắm mắt lại tất cả. Vì vậy, chúng tôi cần một thư viện hoặc chương trình thực sự hoạt động.
Chúng có nhiều dạng ASCII, ISO-8859-1, UTF-8, Microsoft CP1252 hoặc Apple MacRoman. Mặc dù chúng tôi biết rằng chúng tôi có thể biết liệu thứ gì đó có phải là ASCII hay không và chúng tôi cho rằng một sự thay đổi tốt khi biết liệu thứ gì đó có thể là UTF-8 hay không, chúng tôi vẫn lo lắng về các mã hóa 8 bit. Bởi vì chúng tôi đang chạy trong môi trường Unix hỗn hợp (Solaris, Linux, Darwin) với hầu hết các máy tính để bàn là Mac, chúng tôi có một số tệp MacRoman khá khó chịu. Và những điều này đặc biệt là một vấn đề.
Trong một thời gian, tôi đang tìm cách để xác định theo chương trình
- ASCII
- ISO-8859-1
- CP1252
- MacRoman
- UTF-8
có trong tệp và tôi chưa tìm thấy chương trình hoặc thư viện nào có thể phân biệt một cách đáng tin cậy giữa ba bảng mã 8 bit khác nhau đó. Chúng tôi có thể có hơn một nghìn tệp MacRoman, vì vậy bất kỳ bộ dò ký tự nào chúng tôi sử dụng đều phải có khả năng phát hiện ra chúng. Không có gì tôi đã nhìn có thể quản lý được mánh khóe. Tôi đã hy vọng lớn vào thư viện bộ dò mã ICU , nhưng nó không thể xử lý MacRoman. Tôi cũng đã xem xét các mô-đun để làm điều tương tự trong cả Perl và Python, nhưng lặp đi lặp lại nó luôn là một câu chuyện giống nhau: không hỗ trợ phát hiện MacRoman.
Do đó, những gì tôi đang tìm kiếm là một thư viện hoặc chương trình hiện có xác định một cách đáng tin cậy tệp nào trong số năm bảng mã đó — và tốt hơn là nhiều hơn thế. Đặc biệt, nó phải phân biệt giữa ba bảng mã 3 bit mà tôi đã trích dẫn, đặc biệt là MacRoman . Các tập tin có hơn 99% văn bản bằng tiếng Anh; có một số trong các ngôn ngữ khác, nhưng không nhiều.
Nếu đó là mã thư viện, thì tùy chọn ngôn ngữ của chúng tôi dành cho nó là Perl, C, Java hoặc Python và theo thứ tự đó. Nếu nó chỉ là một chương trình, thì chúng tôi không thực sự quan tâm đến ngôn ngữ của nó miễn là nó có nguồn gốc đầy đủ, chạy trên Unix và hoàn toàn không bị cản trở.
Có ai khác gặp vấn đề này với hàng nghìn tệp văn bản kế thừa được mã hóa ngẫu nhiên không? Nếu vậy, bạn đã cố gắng giải quyết nó như thế nào, và bạn đã thành công như thế nào? Đây là khía cạnh quan trọng nhất trong câu hỏi của tôi, nhưng tôi cũng quan tâm đến việc liệu bạn có nghĩ rằng việc khuyến khích các lập trình viên đặt tên (hoặc đổi tên) tệp của họ bằng mã hóa thực tế mà các tệp đó đang sử dụng sẽ giúp chúng tôi tránh được vấn đề trong tương lai hay không. Có ai đã từng cố gắng thực thi điều này trên cơ sở thể chế, và nếu vậy, điều đó có thành công hay không, và tại sao?
Và vâng, tôi hoàn toàn hiểu tại sao người ta không thể đảm bảo một câu trả lời chắc chắn cho bản chất của vấn đề. Điều này đặc biệt xảy ra với các tệp nhỏ, nơi bạn không có đủ dữ liệu để tiếp tục. May mắn thay, các tệp của chúng tôi hiếm khi nhỏ. Ngoài README
tệp ngẫu nhiên , hầu hết đều có kích thước từ 50k đến 250 nghìn và nhiều tệp lớn hơn. Bất cứ thứ gì có kích thước lớn hơn vài K đều được đảm bảo bằng tiếng Anh.
Miền vấn đề là khai thác văn bản y sinh, vì vậy đôi khi chúng tôi xử lý kho tài liệu rộng lớn và cực kỳ lớn, như tất cả kho lưu trữ Truy cập Mở của PubMedCentral. Một tệp khá lớn là BioThesaurus 6.0, với dung lượng 5,7 gigabyte. Tệp này đặc biệt khó chịu vì nó gần như là UTF-8. Tuy nhiên, một số numbskull đã đi và mắc kẹt một vài dòng trong đó bằng một số mã hóa 8 bit — tôi tin là Microsoft CP1252. Phải mất một khoảng thời gian trước khi bạn đi trên chuyến đó. :(