11

Tôi đang tìm một số công cụ dòng lệnh cho Linux mà có thể giúp tôi phát hiện và chuyển đổi tập tin từ bộ ký tự như iso-8859-1windows-1252-utf-8 và từ kết thúc dòng của Windows cho các kết thúc dòng Unix.Làm thế nào để đảm bảo tất cả các tệp nguồn của tôi vẫn giữ nguyên UTF-8 với các đầu dòng Unix?

Lý do tôi cần điều này là tôi đang làm việc trên các dự án trên máy chủ Linux qua SFTP với trình chỉnh sửa trên Windows (như Văn bản siêu việt) mà chỉ liên tục vít những thứ này lên. Ngay bây giờ tôi đoán khoảng một nửa tác phẩm của tôi là utf-8, còn lại là iso-8859-1windows-1252 như nó có vẻ chữ Sublime chỉ là chọn nhân vật do đó những biểu tượng tập tin chứa khi Tôi lưu nó. Các đầu cuối dòng luôn là kết thúc của dòng Windows mặc dù tôi đã chỉ định trong các tùy chọn mặc định kết thúc dòng là LF, vì vậy khoảng một nửa tệp của tôi có LF và một nửa là CRLF.

Vì vậy, tôi sẽ cần ít nhất một công cụ mà đệ quy sẽ quét thư mục dự án của tôi và cảnh báo cho tôi các tập tin mà đi chệch khỏi utf-8 với LF kết thúc dòng vì vậy tôi bằng tay có thể khắc phục điều đó trước khi tôi cam kết thay đổi của tôi để GIT.

Bất kỳ nhận xét và trải nghiệm cá nhân nào về chủ đề cũng sẽ được hoan nghênh.

Cảm ơn


Edit: Tôi có một giải pháp tạm thời trong nơi mà tôi sử dụng treefile thông tin đầu ra về tất cả các tập tin trong dự án của tôi, nhưng nó kinda rung rinh. Nếu tôi không bao gồm các tùy chọn -i cho file sau đó rất nhiều tác phẩm của tôi được đầu ra khác nhau như ASCII C++ chương trình văn bảntài liệu HTML textvăn bản tiếng Anh vv:

 
$ tree -f -i -a -I node_modules --noreport -n | xargs file | grep -v directory 
./config.json:    ASCII C++ program text 
./debugserver.sh:   ASCII text 
./.gitignore:    ASCII text, with no line terminators 
./lib/config.js:   ASCII text 
./lib/database.js:   ASCII text 
./lib/get_input.js:   ASCII text 
./lib/models/stream.js:  ASCII English text 
./lib/serverconfig.js:  ASCII text 
./lib/server.js:   ASCII text 
./package.json:    ASCII text 
./public/index.html:  HTML document text 
./src/config.coffee:  ASCII English text 
./src/database.coffee:  ASCII English text 
./src/get_input.coffee:  ASCII English text, with CRLF line terminators 
./src/jtv.coffee:   ASCII English text 
./src/models/stream.coffee: ASCII English text 
./src/server.coffee:  ASCII text 
./src/serverconfig.coffee: ASCII text 
./testserver.sh:   ASCII text 
./vendor/minify.json.js: ASCII C++ program text, with CRLF line terminators 

Nhưng nếu tôi làm bao gồm -i nó không chỉ cho tôi terminators dòng:

 
$ tree -f -i -a -I node_modules --noreport -n | xargs file -i | grep -v directory 
./config.json:    text/x-c++; charset=us-ascii 
./debugserver.sh:   text/plain; charset=us-ascii 
./.gitignore:    text/plain; charset=us-ascii 
./lib/config.js:   text/plain; charset=us-ascii 
./lib/database.js:   text/plain; charset=us-ascii 
./lib/get_input.js:   text/plain; charset=us-ascii 
./lib/models/stream.js:  text/plain; charset=us-ascii 
./lib/serverconfig.js:  text/plain; charset=us-ascii 
./lib/server.js:   text/plain; charset=us-ascii 
./package.json:    text/plain; charset=us-ascii 
./public/index.html:  text/html; charset=us-ascii 
./src/config.coffee:  text/plain; charset=us-ascii 
./src/database.coffee:  text/plain; charset=us-ascii 
./src/get_input.coffee:  text/plain; charset=us-ascii 
./src/jtv.coffee:   text/plain; charset=us-ascii 
./src/models/stream.coffee: text/plain; charset=us-ascii 
./src/server.coffee:  text/plain; charset=us-ascii 
./src/serverconfig.coffee: text/plain; charset=us-ascii 
./testserver.sh:   text/plain; charset=us-ascii 
./vendor/minify.json.js: text/x-c++; charset=us-ascii 

Cũng tại sao nó hiển thị charset = vn-ascii và không phải utf-8? Và văn bản /x-C++ là gì? Có cách nào tôi có thể xuất chỉ charset=utf-8line-terminators=LF cho mỗi tệp không?

+0

Đối với một workaround, có lẽ bạn có thể bao gồm một bình luận với một mã ký tự decidedly không phải ASCII (biểu tượng bản quyền đến với tâm trí) và lưu dưới dạng UTF-8 - có lẽ điều này là đủ để Sublime Text ngừng phỏng đoán quá nhiều. – tripleee

+1

Tôi cũng không thể cho cuộc sống của tôi có được Sublime Text để chỉ sử dụng vi phạm ngắt dòng Unix cho tình yêu của Thiên Chúa !! "default_line_ending": "unix" chỉ hoạt động! – jlarson

Trả lời

12

Giải pháp mà tôi đã kết thúc là hai plugin Sublime Text 2 "EncodingHelper""LineEndings". bây giờ tôi có được cả hai mã hóa tập tin và kết thúc dòng trong thanh trạng thái:

Sublime Text 2 status bar

Nếu mã hóa là sai, tôi có thể File-> Save với Encoding. Nếu kết thúc dòng là sai, các plugin sau đi kèm với lệnh cho việc thay đổi kết thúc dòng:

Sublime Text 2 commands

+0

Rất tiếc, plugin "LineEndings" đã biến mất ... – Hubro

3

Nếu một tập tin không có BOM, và không có nhân vật thú vị 'trong phạm vi số văn bản file nhìn, file kết luận rằng nó là ASCII ISO-646 - một tập hợp con nghiêm ngặt của UTF-8. Bạn có thể thấy rằng việc đặt BOM vào tất cả các tệp của bạn sẽ khuyến khích tất cả các công cụ Windows này hoạt động; quy ước của một BOM trên một tệp UTF-8 có nguồn gốc trên Windows. Hoặc nó có thể làm mọi thứ tồi tệ hơn. Đối với x/C++, tốt, đó chỉ là file tryin 'hữu ích và không thành công. Bạn javascript có một cái gì đó trong nó trông giống như C + +.

Apache Tika có trình phát hiện mã hóa; bạn thậm chí có thể sử dụng trình điều khiển dòng lệnh đi kèm với nó như là một thay thế cho file. Nó sẽ dính vào các loại MIME và không đi lang thang vào C++.

+0

Cảm ơn bạn đã giải thích. Đối với việc sử dụng bộ dò mã hóa của Apache Tika ... Nó giống như mua một chiếc tàu du lịch để băng qua một vũng nước. Những gì tôi đang tìm kiếm là một công cụ dòng lệnh để phân tích các tập tin sẽ cung cấp cho tôi đầu ra mà tôi đang tìm kiếm, đó là mã hóa ký tự và các ký tự dòng – Hubro

+0

Chỉ cần đảm bảo vũng nước không có rạn san hô. Thực sự, sử dụng CLI của họ chỉ là 'sử dụng lệnh'. Tôi không nhớ nếu icu4c bao gồm một lệnh mà có thể là một giải pháp thay thế cạnh tranh, hoặc việc sử dụng iconv với các tùy chọn phù hợp sẽ cung cấp cho bạn một lỗi rõ ràng cho non-UTF-8. – bmargulies

+0

Hãy coi chừng rằng 'tập tin' đôi khi sử dụng các phỏng đoán thô tục thô tục - ví dụ 'x-C++' của bạn cho thấy nó đưa ra một dự đoán sai. Nếu bạn biết chính xác những gì bạn đang tìm kiếm, một vài lệnh 'grep' đơn giản có thể giúp bạn phân loại các tệp của mình. – tripleee

2

Thay vì file, hãy thử một chương trình tùy chỉnh để chỉ kiểm tra những thứ bạn muốn. Đây là một bản hack nhanh, chủ yếu dựa trên some Google hits, được viết bởi @ikegami.

#!/usr/bin/perl 

use strict; 
use warnings; 

use Encode qw(decode); 

use vars (qw(@ARGV)); 

@ARGV > 0 or die "Usage: $0 files ...\n"; 

for my $filename (@ARGV) 
{ 
    my $terminator = 'CRLF'; 
    my $charset = 'UTF-8'; 
    local $/; 
    undef $/; 
    my $file; 
    if (open (F, "<", $filename)) 
    { 
     $file = <F>; 
     close F;  
     # Don't print bogus data e.g. for directories 
     unless (defined $file) 
     { 
      warn "$0: Skipping $filename: $!\n; 
      next; 
     } 
    } 
    else 
    { 
     warn "$0: Could not open $filename: $!\n"; 
     next; 
    } 

    my $have_crlf = ($file =~ /\r\n/); 
    my $have_cr = ($file =~ /\r(?!\n)/); 
    my $have_lf = ($file =~ /(?!\r\n).\n/); 
    my $sum = $have_crlf + $have_cr + $have_lf; 
    if ($sum == 0) 
    { 
     $terminator = "no"; 
    } 
    elsif ($sum > 2) 
    { 
     $terminator = "mixed"; 
    } 
    elsif ($have_cr)  
    { 
     $terminator = "CR"; 
    } 
    elsif ($have_lf) 
    { 
     $terminator = "LF"; 
    } 

    $charset = 'ASCII' unless ($file =~ /[^\000-\177]/); 

    $charset = 'unknown' 
     unless eval { decode('UTF-8', $file, Encode::FB_CROAK); 1 }; 

    print "$filename: charset $charset, $terminator line endings\n"; 
} 

Lưu ý rằng điều này không có khái niệm về di sản mã hóa 8-bit - nó sẽ chỉ đơn giản là ném unknown nếu nó không tinh khiết 7-bit ASCII hay UTF-8 thích hợp.

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