Làm cách nào để hiển thị Unicode UTF-8 dưới dạng Unicode?


12

Tôi có một số tệp văn bản được mã hóa UTF-8 hiển thị mã thoát lạ trong Emacs. Ví dụ, văn bản này:

Trong ista quaestione primo exponam quid intellectendum est per hoc nomen 'Deus'; secundo, phản ứng quảng cáo qua tắc nghẽn.

Hiển thị như thế này trong Emacs:

nhập mô tả hình ảnh ở đây

Điều này chỉ xảy ra trong Emacs. Các biên tập viên khác hiển thị văn bản chính xác. Làm thế nào tôi có thể khắc phục vấn đề này?


Cập nhật 1

Nếu tôi gọi revert-buffer-with-coding-systemvà chọn utf-8tập tin nhận được đọc chính xác. Vì vậy, như Gilles đã đoán chính xác, Emacs không phát hiện mã hóa tệp. Nếu tôi thêm mã ; -*- coding: utf-8 -*-vào tệp, Emacs sẽ mở và hiển thị chính xác.


Cập nhật 2

Tôi đã mã hóa lại tệp trong "UTF-8 với mã hóa BOM" và bây giờ nó hiển thị ổn trong Emacs. Tôi không biết sự khác biệt giữa hai loại, nhưng Emacs dường như chỉ biết về loại BOMed.


Emacs không nhận ra tệp là UTF-8. Nội dung của tập tin init của bạn là gì? Phiên bản nào của Emacs bạn đang chạy? Nó có thay đổi gì không nếu bạn bắt đầu Emacs với emacs -qhoặc emacs -Q?
Gilles 'SO- ngừng trở thành ác quỷ'

Tôi không có vấn đề với các tệp UTF-8 khác. Tôi đang chạy GNU Emacs 24.4.4. Không có sự khác biệt với emacs -qhoặc emacs -Q.
NVaughan 22/03/2015

À, nếu nó hoạt động với các tệp khác và trong một cấu hình nguyên sơ thì lý do có lẽ là tệp đó cũng chứa UTF-8 không hợp lệ ở đâu đó. Hãy để tôi xem làm thế nào để nói với Emacs ...
Gilles 'SO- đừng trở nên xấu xa'

Câu trả lời:


10

Vì một số lý do, Emacs không nhận ra tệp là UTF-8. Bạn có thể buộc Emacs mở lại tệp dưới dạng UTF-8 bằng cách chạy lệnh C-x RET r( revert-buffer-with-coding-system) và nhập utf-8.

Lý do tại sao Emacs không nhận ra tệp này là UTF-8 (nhưng nhận ra tệp khác) có thể là do nó chứa một số chuỗi UTF-8 không hợp lệ. Chuỗi này sẽ vẫn xuất hiện dưới dạng dấu gạch chéo ngược theo sau là ba chữ số bát phân có màu khác ( escape-glyphmặt) sau khi diễn giải lại tệp dưới dạng UTF-8. Bạn có thể tìm kiếm một chuỗi như vậy bằng cách chạy C-M-s( isearch-regexp) và tìm kiếm

[^^@-~[:multibyte:]]

trong đó ^@được nhập bằng cách gõ C-q C-SPC(đó là ký tự ^ @ = 0, không phải là chuỗi ký tự hai ký tự; ký tự trước ký tự là ký tự dấu mũ).

Bạn có thể buộc Emacs để nhận nội dung tập tin UTF-8 bằng cách thêm một biến tập tin hệ thống mã hóa : đặt một cái gì đó giống như -*-coding: utf-8-*-trên dòng đầu tiên, hoặc đặt một cái gì đó như thế này ở gần cuối của tập tin (bạn có thể thay thế #bằng bất kỳ tiền tố, nhưng Local Variables:End:phải xuất hiện chính xác như thế này với dấu hai chấm):

# Local Variables:
# coding: utf-8
# End:

Emacs chọn mã hóa theo đó các tệp được diễn giải dựa trên một số cài đặt, chủ yếu là môi trường ngôn ngữ và các biến auto-coding-alistauto-coding-regexp-alist. Vì bạn có cùng vấn đề với tệp này ngay cả khi đang chạy emacs -Q, tôi nghĩ rằng đây không phải là vấn đề với các cài đặt đó, nhưng với nội dung tệp.


Nếu tôi mở tập tin mà không có sự biến tập tin hệ thống mã hóa (ví dụ khi tập tin hiển thị sai) và tiến hành tìm kiếm regex, tất cả của tôi \342, \200, \230vv được chọn. Nhưng nếu tôi mở "chính xác" (sử dụng biến mã hóa), thì không có kết quả tìm kiếm nào xuất hiện.
NVaughan

@NVaughan Hmmm. Sau đó, tôi không hiểu tại sao tệp này không được công nhận là UTF-8 khi các tệp khác (đặc biệt là dưới emacs -Q).
Gilles 'SO- ngừng trở thành ác quỷ'

1

Đã muộn để trả lời câu hỏi về BOM, nhưng dù sao tôi cũng sẽ làm điều đó.

Dấu thứ tự byte (BOM) là một chuỗi gồm ba byte \ xef \ xbb \ xbf, ở đầu tệp, biểu thị cho các hệ thống và ứng dụng rằng nội dung được mã hóa dưới dạng UTF-8. Đúng là siêu dữ liệu, không được coi là một phần của nội dung.

Hầu hết các ứng dụng - Emacs là một trong số đó - tôn vinh BOM và viết tất cả các tệp UTF-8 với nó. Các ứng dụng khác có thể tôn vinh nó trong việc đọc, nhưng không viết nó; và những người khác không biết về nó và có thể ném một thông báo lỗi khi họ gặp phải nó. Nói cách khác, tình hình lộn xộn. Tôi thích sử dụng nó bất cứ nơi nào có thể.


-1

Chỉ dành cho các hệ thống giống như UNIX.

Trong nhiều trường hợp, định nghĩa mã hóa đơn giản trong ~ / .bashrc ~ / bash_profile

LANG=en_EN.UTF8

hoàn thành với

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8

trong ~ / .profile sẽ giải quyết vấn đề của bạn.

PS Sau những chỉnh sửa này, bạn cần phải LIÊN QUAN ĐẾN phiên của mình để cho phép các thay đổi được hiển thị.


Mặc dù những gì bạn nói có thể hữu ích, điều này dường như không trả lời câu hỏi này, vì vấn đề chỉ xảy ra với một số tệp utf-8.
JeanPierre

Giả sử rằng sau khi định nghĩa mã hóa nghiêm ngặt trong các tệp cấu hình, sự cố này có thể biến mất cho tất cả các tệp mãi mãi :-)
Alioth
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.