2013-07-25 29 views
6

Trong Emacs là những gì, sau khi nhậpsự khác biệt giữa các loại khác nhau của 'utf-8' trong emacs

M-x revert-buffer-with-coding-system 

tôi có thể thấy nhiều loại 'utf-8', ví dụ, utf-8, utf-8-auto-unix, utf-8-emacs-unix và vv

tôi muốn biết sự khác biệt trong số đó là những gì.

Tôi đã googled chúng nhưng không thể tìm thấy câu trả lời thích hợp.

P.S.

Tôi đặt câu hỏi này vì tôi gặp sự cố mã hóa cách đây vài tháng. Tôi đã viết một chương trình php trong Emacs và trong tôi ~/emacs, tôi đặt

(prefer-coding-system 'utf-8) 

nhưng khi duyệt trang php trong một trình duyệt, tôi thấy trình duyệt không thể hiển thị nội dung một cách chính xác do sự vấn đề mã hóa mặc dù tôi đã viết

<meta name="Content-Type" content="text/html; charset=UTF-8" /> 

trong trang.

Nhưng sau khi tôi sử dụng notepad ++ để lưu trữ tệp trong utf-8, trình duyệt có thể hiển thị nội dung chính xác.

Vì vậy, tôi muốn tìm hiểu thêm về mã hóa trong Emacs.

+1

Bạn luôn có thể thử 'chế độ hexl' để xem chính xác tệp được lưu trữ như thế nào. Rất có thể điều này liên quan đến BOM, và có thể, thứ tự byte trong BOM (có một biến thể của UTF-8 trong đó byte không nằm trong thứ tự mạng iirc, không ai sử dụng nó thực sự, nhưng nó có thể ở đó để hoàn thành) . –

Trả lời

9

Phần cuối cùng của tên mã hóa (ví dụ:mac trong utf-8-mac) thường là để mô tả các nhân vật đặc biệt sẽ được sử dụng tại cuối dòng:

  • -mac: CR, dòng delimiter tiêu chuẩn với hệ điều hành MacOS (cho đến khi OS X)
  • -unix: LF dấu phân cách tiêu chuẩn cho các hệ thống Unice (vì vậy BSD-based Mac OS X)
  • -dos: CR+LF dấu phân cách cho hệ điều hành DOS/Windows

một số mã hóa thêm các thông số bao gồm:

  • -emacs: hỗ trợ cho mã hóa tất cả các nhân vật Emacs (bao gồm cả phi Unicode)
  • -with-signature: buộc việc sử dụng của BOM (xem dưới đây)
  • -auto: autodetect các BOM

Bạn có thể kết hợp các khả năng khác nhau, làm cho danh sách được hiển thị trong Emacs.

Để nhận được một số thông tin về loại dòng kết thúc, BOMs và bảng mã được cung cấp bởi mã hóa, bạn có thể sử dụng describe-coding-system, hoặc: ChC

Liên quan đến BOM:

  • sự tiêu chuẩn utf định nghĩa một chữ ký đặc biệt được đặt ở đầu các tệp (văn bản) để phân biệt thứ tự các mã byte (như utf-16 lưu các ký tự với 2 byte - hoặc 16 bit) hoặc endianess: một số syste ms đặt byte quan trọng nhất đầu tiên (big-endian ->utf-16be) một số khác đặt byte ít quan trọng nhất đầu tiên (little-endian ->utf-16le). chữ ký đó được gọi là BOM: các Byte Order Mark

  • trong utf-8, mỗi nhân vật được đại diện bởi một byte duy nhất (ngoại trừ cho các ký tự mở rộng lớn hơn 127, họ sử dụng một chuỗi đặc biệt của byte) do đó chỉ định một thứ tự byte là một điều vô nghĩa nhưng chữ ký này vẫn hữu dụng để phát hiện tệp utf-8 thay vì một văn bản thuần túy ascii. Một tệp utf-8 khác với tệp ascii chỉ trên các ký tự mở rộng và có thể không thể phát hiện mà không phân tích cú pháp toàn bộ tệp cho đến khi tìm thấy tệp khi POMudo-BOM hiển thị ngay lập tức.(BTW Emacs là rất hiệu quả để làm như vậy tự động phát hiện)

  • FYI, BOMs là các byte sau là byte đầu tiên của một tập tin:

    • UTF-16LE: FF FE
    • UTF-16BE : FE FF
    • utf-8: EF BB BF
  • bạn có thể hỏi Emacs để mở một tập tin mà không cần bất kỳ chuyển đổi với find-file-literally: nếu dòng đầu tiên bắt đầu với  bạn thấy utf-8 undecoded BOM

Như @wvxvw nói, vấn đề của bạn là một thiếu có thể xảy ra của BOM vào đầu của tập tin đó đã làm cho nó sai giải thích và trả lại . BTW, M-x hexl-mode cũng là một công cụ rất hữu ích để kiểm tra nội dung thô của tệp. Cảm ơn bạn đã chỉ cho tôi (tôi thường sử dụng trình chỉnh sửa hex bên ngoài cho nó, trong khi nó có thể được thực hiện trực tiếp trong Emacs)

+0

Cảm ơn bạn rất nhiều! Sau khi tôi hoàn nguyên mã hóa từ ** utf-8 ** thành ** utf-8-with-signature ** trong Emacs, trình duyệt di động * chrome * có thể hiển thị trang php chính xác. Tôi tìm thấy [trang này] (http://www.unicode.org/faq/utf_bom.html#utf8-2) và tôi biết rằng ** Trong trường hợp BOM được sử dụng với UTF-8, nó chỉ được sử dụng làm mã hóa chữ ký để phân biệt UTF-8 với các mã hóa khác **. Và tôi có một câu hỏi rằng tại sao ** utf-8 & BOM ** hoạt động trong khi ** utf-8 ** không có trên trình duyệt Chrome nhưng cả hai đều hoạt động trên PC chrome. Có phải lỗ hổng của trình duyệt Chrome dành cho thiết bị di động không? – flyer

+0

Theo [trang này] (http://www.gnu.org/software/emacs/manual/html_node/emacs/Text-Coding.html), tôi đã nhập ** Cx utf-8-with-signature * * nhưng không thể chuyển đổi tệp từ mã của tệp thành ** utf-8-with-signature ** trừ khi tôi sửa đổi tệp ** ~/.emacs ** và đặt mã utf-8-with- Chữ ký. Có cách nào dễ dàng để chuyển đổi mã của một tệp thành ** utf-8-with-signature ** trong Emacs không? – flyer

+0

@flyer: bạn phải có lỗi đánh máy: để chỉ định mã hóa cho lệnh, bạn phải thực hiện theo 'Cx RET' bằng' f' (mã được sử dụng trong khi lưu), 'r' (tải lại tệp có mã hóa) hoặc' c' (mã hóa cho lệnh tiếp theo). Nếu tôi mở một tập tin ascii sau đó 'C-x RET f utf-8-với-chữ ký RET' theo sau là' C-x C-s' tập tin được lưu trong mã hóa mới (Emacs24) – Seki

2

Không thể nói nhiều về vấn đề này, ngoại trừ việc sau khi cài đặt

(prefer-coding-system 'utf-8) 
(setq coding-system-for-read 'utf-8) 
(setq coding-system-for-write 'utf-8) 

tôi đã không có bất kỳ vấn đề unicode trong hơn 2 năm.

+0

Cảm ơn lời khuyên của bạn. Sau khi cài đặt mã hóa ** utf-8-with-signature **, nó hoạt động. : D – flyer

+0

Tôi sử dụng: (thích mã hóa-hệ thống 'utf-8) (thiết lập mặc định-mã hóa-hệ thống' utf-8) (setq-mặc định-tệp-mã hóa-hệ thống 'utf-8) Trợ giúp cho mã-hệ thống-cho-{đọc, viết} nói rằng bạn không nên sử dụng chúng. – jpkotta

+0

Tôi nghĩ rằng doc đề cập đến các nhà văn gói không cho người dùng. Tôi có nghĩa là tôi sẽ không được hạnh phúc nếu một số gói thay đổi sở thích này cho tôi. Nhưng tôi biết làm thế nào tôi muốn các tập tin của tôi đọc và lưu lại. –

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