iconv tạo UTF-16 với BOM


11

Lấy cảm hứng từ câu hỏi này , tôi có thể sử dụng iconvlệnh để tạo đầu ra UTF-16 với BOM và với độ bền được chỉ định không?

Các iconvlệnh chuyển đổi văn bản từ một mã hóa khác.

Ví dụ:

echo hello | iconv -f ascii -t utf-16

tạo ra một đại diện UTF-16 của "hello\n".

Các tệp UTF-16 thường xuyên, nhưng không phải lúc nào cũng bắt đầu bằng Dấu thứ tự Byte (BOM), đây là mã hóa 2 byte của ký tự Unicode U+FEFF. Bạn có thể xác định độ bền của tệp UTF-16 bằng BOM bằng cách kiểm tra xem hai byte đầu tiên là FE FFhay FF FE.

Các iconvlệnh có một số tùy chọn để tạo ra UTF-16 đầu ra:

$ iconv --list | grep -i utf-16
UTF-16//
UTF-16BE//
UTF-16LE//

Lệnh này:

echo hello | iconv -f ascii -t utf-16be

tạo UTF-16 lớn không có BOM ; có vẻ như giả định rằng nếu bạn đã chỉ định tuổi thọ, bạn không cần chỉ ra nó trong đầu ra. Tương tự, utf-16letạo UTF-16 nhỏ cuối cùng không có BOM.

Điều này:

echo hello | iconv -f ascii -t utf-16

tạo ra (trên hệ thống Ubuntu x86 của tôi) UTF-16 nhỏ cuối cùng bằng BOM - nhưng tôi đã thấy một báo cáo về một lệnh tương tự tạo UTF-16 lớn cuối cùng với BOM, ngay cả trên một hệ thống cuối nhỏ.

Tôi luôn có thể sử dụng utf-16behoặc utf-16leđăng ký BOM theo cách thủ công, nhưng tôi đang tìm giải pháp chỉ sử dụng iconvlệnh.

Một cách giải quyết khác, nếu bạn biết những gì endianness -t utf-16tạo ra, là:

echo hello | iconv -f ascii -t utf-16 | dd conv=swab 2>/dev/null

Những gì tôi muốn thích để sử dụng là một cái gì đó như:

iconv -f ascii -t utf-16bebom # big-endian with BOM
iconv -f ascii -t utf-16lebom # little-endian with BOM

nhưng iconvkhông hỗ trợ điều đó.

BIÊN TẬP :

Ai đó có quyền truy cập vào hệ thống Mac OSX x86 có thể đăng nhận xét hiển thị đầu ra (sao chép và dán) của lệnh sau không?

echo hello | iconv -f ascii -t utf-16 | od -x

1
Một BOM làm giảm tính di động của dữ liệu nhưng bạn có thể thêm nó theo cách này
RedGrittyBrick

@RedGrittyBrick: Làm thế nào để giảm tính di động (cụ thể cho UtF-16)? Tôi biết tôi có thể tạo BOM một cách hiệu quả; Tôi đang tìm kiếm một cách để làm như vậy chỉ bằng cách sử dụng iconv- và tự hỏi tại sao -t utf-16dường như để lại sự tồn tại không được xác định.
Keith Thompson

Tôi đoán iconv giả định thứ tự byte nền tảng hiện tại nếu bạn không chỉ định rõ ràng. Trên một số nền tảng khác ngoài windows, một số công cụ xử lý văn bản không mong đợi BOM và do đó làm sai. Một ví dụ có thể là khi nối các tệp văn bản hoặc sử dụng các mẫu dựa trên tệp để xây dựng nội dung. "Đối với các bộ ký tự đã đăng ký IANA UTF-16BE và UTF-16LE, không nên sử dụng dấu thứ tự byte vì tên của các bộ ký tự này đã xác định thứ tự byte"
RedGrittyBrick

Câu hỏi này cho thấy iconv -f UTF-8 -t UTF-16, chạy trên một hệ thống nhỏ (MacOS), tạo UTF-16 lớn cuối cùng với BOM, có vẻ rất kỳ quặc.
Keith Thompson

Câu trả lời:


9

Không , nếu bạn chỉ định thứ tự byte, iconvkhông chèn BOM.

Đây là từ Hiệp hội Unicode

Q: Làm thế nào tôi nên đối phó với BOM?

A: Dưới đây là một số hướng dẫn để làm theo:

  1. Một giao thức cụ thể (ví dụ: các quy ước của Microsoft cho các tệp .txt) có thể yêu cầu sử dụng BOM trên các luồng dữ liệu Unicode nhất định, chẳng hạn như các tệp. Khi bạn cần tuân thủ một giao thức như vậy, hãy sử dụng BOM.
  2. Một số giao thức cho phép các BOM tùy chọn trong trường hợp văn bản không được mã hóa. Trong những trường hợp đó,
    • Trong đó một luồng dữ liệu văn bản được biết là văn bản thuần túy, nhưng mã hóa không xác định, BOM có thể được sử dụng làm chữ ký. Nếu không có BOM, mã hóa có thể là bất cứ thứ gì.
    • Trong đó một luồng dữ liệu văn bản được biết là văn bản Unicode đơn giản (nhưng không phải là endian), thì BOM có thể được sử dụng làm chữ ký. Nếu không có BOM, văn bản nên được hiểu là big endian.
  3. Một số giao thức hướng byte mong đợi các ký tự ASCII ở đầu tệp. Nếu UTF-8 được sử dụng với các giao thức này, nên sử dụng BOM làm chữ ký biểu mẫu mã hóa.
  4. Trong đó loại chính xác của luồng dữ liệu được biết đến (ví dụ: Unicode big endian hoặc Unicode little endian), không nên sử dụng BOM. Đặc biệt, bất cứ khi nào một luồng dữ liệu được khai báo là UTF-16BE, UTF-16LE, UTF-32BE hoặc UTF-32LE thì không được sử dụng BOM .

(nhấn mạnh của tôi)

Tôi hy vọng iconvsẽ cố gắng trung thành với những hướng dẫn cuối cùng.


Cập nhật.

Một hồi quy

Theo ý kiến ​​của tôi:

  1. Một tùy chọn để chỉ định BOM chắc chắn sẽ là một tính năng bổ sung hữu ích cho iconv.

  2. Một tệp UTF-16LE không có BOM thể sử dụng được trong Windows, mặc dù đôi khi phải nỗ lực thêm. Ví dụ, đối thoại Mở tệp của Notepad cho phép bạn chọn "Unicode" là tên của Microsoft cho "UTF-16LE" và (không ngạc nhiên) dường như hoạt động trên các tệp mà không có BOM.

  3. Tôi có thể mở tệp kiểm tra UTF-16LE (không có BOM) hoặc tệp kiểm tra UTF-8 (không có BOM) trong Windows Notepad (XP) theo cách thông thường, ví dụ: bằng cách bấm đúp vào tên tệp trong trình thám hiểm. Điều đó dường như có thể sử dụng với tôi. Tôi biết rằng đôi khi Windows sẽ đoán mã hóa không chính xác - Trong trường hợp đó bạn phải báo cho Notepad mã hóa khi mở tệp. Sự bất tiện này có nghĩa là bao gồm cả BOM thích hợp hơn cho các tệp văn bản được sử dụng trên Windows.

  4. Nếu một ứng dụng cụ thể sẽ không hoạt động với bất kỳ thứ gì ngoài tệp UTF-16LE với BOM, thì tôi đồng ý rằng tệp UTF-16LE không có BOM không thể sử dụng được cho ứng dụng cụ thể đó.

  5. Tôi nghi ngờ rằng nếu bạn có thể khiến mọi thứ hoạt động với UTF-8 (không có BOM), đó là giải pháp tốt nhất trong dài hạn.

Tuy nhiên, câu trả lời cho câu hỏi " tôi có thể sử dụng lệnh iconv để tạo đầu ra UTF-16 bằng BOM không và với độ bền được chỉ định " hiện tại là " Không ".


1
Và những gì về hướng dẫn đầu tiên, A.1? Nếu f tôi muốn tạo tệp văn bản Unicode có thể sử dụng được trên hệ thống Windows x86, thì đó phải là tệp UTF16 cuối cùng có BOM .
Keith Thompson

@KeithThndry: Các hệ thống nên chấp nhận cả UTF16LE và UTF16BE. Ít nhất Windows Notepad chấp nhận cả hai, khi nói đến .txt- miễn là tệp có BOM.
dùng1686

@KeithThndry: Tôi đồng ý rằng hướng dẫn 1 nên được ưu tiên, tuy nhiên iconv không cung cấp cách để bạn chỉ định BOM. Câu trả lời cho câu hỏi ban đầu của bạn chỉ đơn giản là "Không".
RedGrittyBrick

Không phải là câu trả lời tôi hy vọng, mà là một câu trả lời, và một câu hỏi thấu đáo!
Keith Thompson

2
Câu trả lời này đã giúp tôi - giúp tôi tìm hiểu lý do tại sao tôi bị lừa. Chương trình Windows tiêu chuẩn để xuất / nhập từ sổ đăng ký, C:\Windows\System32\reg.exexuất UTF-16 LE VỚI BOM và sẽ chỉ đọc UTF-16 LE VỚI BOM - sẽ không đọc UTF-16 LE nếu không có BOM và sẽ không đọc UTF-16 BE với BOM - nói cách khác, nó đòi hỏi BOM khi đọc nhưng tốt hơn hết là bạn nên làm đúng! (May mắn thay, nó đọc UTF-8.)
davidbak
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.