Làm cách nào để thay đổi mã hóa tệp bằng vim?


235

Tôi đã quen với việc sử dụng vim để sửa đổi kết thúc dòng của tệp:

$ file file
file: ASCII text, with CRLF line terminators
$ vim file
:set ff=mac
:wq
$ file file
file: ASCII text, with CR line terminators

Có thể sử dụng một quy trình tương tự để thay đổi mã hóa unicode của tệp không? Tôi đang thử những cách sau, không hoạt động:

$ file file.xml
file.xml: Unicode text, UTF-16, little-endian
$ vim file
:set encoding=utf-8
:wq
$ file file.xml
file.xml: Unicode text, UTF-16, little-endian

Tôi thấy ai đó nói rằng anh ta có thể "đặt fileencoding = utf-8, sau đó cập nhật và viết tệp, và nó hoạt động", nhưng tôi dường như đang thiếu một cái gì đó, nếu không anh ta đã nhầm lẫn. Tôi không biết ý của anh ấy là "sau đó cập nhật."

Câu trả lời:



163

Lưu ý rằng có một sự khác biệt giữa

đặt mã hóa

thiết lập mã hóa tập tin

Trong trường hợp đầu tiên, bạn sẽ thay đổi mã hóa đầu ra được hiển thị trong thiết bị đầu cuối. Trong trường hợp thứ hai, bạn sẽ thay đổi mã hóa đầu ra của tệp được ghi.


1
cảm ơn bạn! Apache đã xuất ra utf-8, php cũng vậy, vì vậy trình duyệt đã nói, vì vậy vim đã nói set encodingvà các trang vẫn hiển thị các ký tự được đọc sai là iso-8859-1. bằng cách sử dụng set fileencodingcho thấy một 'Latin1' đẹp
Adriano Varoli Piazza

77

Trong khi sử dụng vim để làm điều đó là hoàn toàn có thể, tại sao bạn không đơn giản sử dụng iconv? Ý tôi là - tải trình soạn thảo văn bản chỉ để thực hiện chuyển đổi mã hóa có vẻ như sử dụng búa quá lớn cho móng quá nhỏ.

Chỉ:

iconv -f utf-16 -t utf-8 file.xml > file.utf8.xml

Và bạn đã hoàn thành.


19
Nhược điểm, iconv có thể không dễ dàng có sẵn trên Windows.
Adriano Varoli Piazza

2
@AdrianoVaroliP Square cũng không vim.

1
Tôi muốn nói rằng nhiều bản tải xuống "chỉ cần cài đặt", thậm chí với một phiên bản di động "cấu thành" dễ dàng có sẵn ".
Adriano Varoli Piazza

2
@ adriano-varoli-p lọc Không, iconv có sẵn trên Windows với Cygwin và MingW, như @ coder-tim lưu ý.
t0r0X

1
@mario Không, Vim rất dễ dàng có sẵn trên Windows: vim.org/doad.php#pc
t0r0X

52

Giống như các bước của bạn, thiết lập mã hóa tập tin sẽ hoạt động. Tuy nhiên, tôi muốn thêm một "bom đặt" để giúp biên tập viên xem tệp là UTF8.

$ vim file
:set bomb
:set fileencoding=utf-8
:wq

8
Cảm ơn câu trả lời của bạn, nó đã dẫn tôi tìm hiểu thêm về dấu thứ tự byte UTF. Tuy nhiên, FYI, việc đặt BOM dường như không cần thiết / không phù hợp với UTF-8 vì đây không phải là định dạng có độ dài byte cố định như 16 hoặc 32. Xem tại đây để được giải thích và tham khảo. Đây không phải là vấn đề (và thậm chí hữu ích) đối với vim, tôi chỉ nghĩ mọi người nên biết rằng nó có thể gây ra sự cố tương thích ở nơi khác.
joelhardi

2
Là nó bombhay bom, và nó có thể unset? EDIT : Có, bạn có thể loại bỏ nó thông qua set nobomb.
icedwater

6
Có, VIm thiết lập cho chúng tôi bomb(với ab).
ruffin

theo các tài liệu, :set bombđược bật nếu :set fenc=utf-8.. xem:he bomb
Evan Carroll

12
tất cả mã hóa cơ sở của chúng tôi hiện thuộc về UTF-8
roblogic

6

Có thể hữu ích để thay đổi mã hóa chỉ trên dòng lệnh trước khi tệp được đọc:

rem On MicroSoft Windows
vim --cmd "set encoding=utf-8" file.ext
# In *nix shell
vim --cmd 'set encoding=utf-8' file.ext

Xem bắt đầu ,--cmd .


3
Biến thể đầu tiên cũng sẽ hoạt động trên các vỏ * nix. 'single quotes'chỉ cần thiết để thoát khỏi tất cả các ký tự meta, thường không phải là những gì bạn muốn.
jpaugh
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.