2010-02-22 19 views
49

Tôi vừa bị gỡ xuống sau khi máy chủ của chúng tôi được cập nhật từ Debian 4 sang 5. Chúng tôi đã chuyển sang môi trường UTF-8 và giờ chúng tôi gặp sự cố khi in văn bản chính xác trên trình duyệt, vì tất cả các tệp đều có mã hóa không phải là utf8 như iso-8859-1, ascii, v.v.Thay đổi tệp mã hóa thành utf-8 qua vim trong tập lệnh

Tôi đã thử nhiều tập lệnh khác nhau.

Cái đầu tiên tôi đã thử là "iconv". Đó là một trong những doesnt làm việc, nó thay đổi nội dung, nhưng các tập tin enconding vẫn không phải utf8.

Cùng vấn đề với enca, encamv, convmv và một số công cụ khác tôi đã cài đặt qua apt-get. Sau đó tôi tìm thấy một mã python, sử dụng mô-đun Universal Detector, để phát hiện mã hóa của một tập tin (hoạt động tốt), nhưng sử dụng lớp unicode hoặc lớp codec để lưu nó như là utf-8 không hoạt động, mà không có bất kỳ lỗi nào.

Cách duy nhất tôi tìm thấy để nhận tệp và nội dung của tệp được chuyển thành UTF-8, là vi.

Đây là những bước tôi làm cho một tập tin:

vi filename.php 
:set bomb 
:set fileencoding=utf-8 
:wq 

Thats nó. Đó là một trong những công trình hoàn hảo. Nhưng làm thế nào có thể có được điều này chạy thông qua một kịch bản. Tôi muốn viết một kịch bản (Linux shell) mà đi qua một thư mục lấy tất cả các tập tin php, sau đó chuyển đổi chúng bằng cách sử dụng vi với các lệnh trên. Như tôi cần phải bắt đầu ứng dụng vi, tôi không biết làm thế nào để làm điều gì đó như thế này:

"vi --run-command=':set bomb, :set fileencoding=utf-8' filename.php"

Hope ai đó có thể giúp tôi.

Trả lời

23

Đây là cách đơn giản nhất tôi biết để làm điều này một cách dễ dàng từ dòng lệnh:

vim +"argdo se bomb | se fileencoding=utf-8 | w" $(find . -type f -name *.php) 

Hoặc tốt hơn nếu số lượng file được dự kiến ​​sẽ được khá lớn:

find . -type f -name *.php | xargs vim +"argdo se bomb | se fileencoding=utf-8 | w" 
+3

Tôi không biết những gì argdo đó có nghĩa là, nhưng tôi đã cố gắng này và nó hoạt động: 'vim + "đặt bom | thiết fileencoding = utf-8 | wq" $ (tìm -type f -name * .php.) ' – NovumCoder

+2

Tốt. argdo chỉ lặp lại lệnh cho mỗi tệp trong danh sách đối số. –

16

Bạn có thể đặt các lệnh của mình vào một tệp, hãy gọi nó là script.vim:

set bomb 
set fileencoding=utf-8 
wq 

Sau đó, yo u gọi Vim bằng tùy chọn -S (nguồn) để thực thi tập lệnh trên tệp bạn muốn sửa. Để làm điều này trên một loạt các tập tin mà bạn có thể làm

find . -type f -name "*.php" -exec vim -S script.vim {} \; 

Bạn cũng có thể đặt lệnh Vim trên dòng lệnh bằng cách sử dụng tùy chọn +, nhưng tôi nghĩ rằng nó có thể dễ đọc hơn như thế này.

Lưu ý: Tôi chưa thử nghiệm điều này.

+1

Cần lưu ý trước khi giới thiệu. ;) – Zolomon

+1

'bom' phá vỡ khả năng tương thích ASCII. Xem [câu trả lời này] (http://stackoverflow.com/questions/5477565/how-to-setup-vim-properly-for-editing-in-utf-8). – tchrist

3

Bạn thực sự có thể muốn đặt nobomb (BOM = dấu thứ tự byte), đặc biệt là trong thế giới [không cửa sổ].

ví dụ: tôi đã có tập lệnh không hoạt động vì có dấu thứ tự byte ở đầu. Nó không thường được hiển thị trong các trình soạn thảo (ngay cả với danh sách được thiết lập trong vi), hoặc trên bảng điều khiển, do đó khó phát hiện.

Các tập tin trông như thế này

#!/usr/bin/perl 
... 

Nhưng cố gắng để chạy nó, tôi nhận được

./filename 
./filename: line 1: #!/usr/bin/perl: No such file or directory 

Không hiển thị, nhưng lúc bắt đầu của tập tin, là BOM 3 byte. Vì vậy, như xa như Linux là có liên quan, tập tin không bắt đầu với #!

Giải pháp là

vi filename 
:set nobomb 
:set fileencoding=utf-8 
:wq 

này loại bỏ BOM vào lúc bắt đầu của tập tin, làm cho nó đúng utf8.

NB Windows sử dụng BOM để xác định tệp văn bản là utf8, chứ không phải ANSI. Linux (và thông số chính thức) thì không.

+0

Cảm ơn lời giải thích quý tộc. Tôi đã đấu tranh với vấn đề này. Cuối cùng tôi đã sử dụng VIM. Ví dụ: vim + "set nobomb | set fenc = utf-8 | x" TEST.CSV – jjwdesign

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