2012-01-11 36 views

Trả lời

41

echo thường xuất ra một ký tự dòng mới vào cuối của chuỗi, để ngăn chặn sử dụng các -n switch:

$ echo -n 'test' | base64 
dGVzdA== 

Tương tự như vậy cho PHP:

$ php 
<?php 
echo base64_encode("test\n"); 
?> 
dGVzdAo= 
+0

Hoàn hảo, cảm ơn! – psynnott

+0

+1 cho -n - đó là một cái mới cho tôi –

+2

+1 để dạy tôi điều gì đó mới về tiếng vang – Peter

9

Khi làm một tiếng vang nó mang lại cho tôi điều này:

MacPro:~ bardiir$ echo 'test' 
test 
MacPro:~ bardiir$ 

Tôi đoán bạn có thể có một bao gồm line- kết thúc trong unix một như echo có lẽ là phụ thêm một ký tự newline ngay cả khi bạn ống nó throuch để mã hóa base64.

+1

Đúng giải thích, cảm ơn bạn nhưng tôi sẽ cung cấp cho các giải pháp để knittl như ông đã cho workaround của "-n". – psynnott

+0

Chắc chắn, là một cái mới cho tôi quá :) – bardiir

11

mở giao diện điều khiển trong trình duyệt của bạn, loại atob('dGVzdAo='):

http://gyazo.com/68d16f666c394887929408c519ac1b23.png

Bạn có thêm ký tự trong đầu vào của mình. Và đó là 0x0A (LF).

+4

+1 cho ['atob'] (https://developer.mozilla.org/en/DOM/window. atob), đó là điều mới mẻ đối với tôi. –

+0

Nhân tiện, chức năng đó không phải là một phần của bất kỳ tiêu chuẩn nào, do đó, đừng nghĩ đến việc sử dụng nó trong sản xuất –

+0

@ M28 ** offtopic **: theo tiêu chuẩn: http://www.whatwg.org/specs/ web-apps/current-work/multipage/webappapis.html # atob và cho IE bạn có thể sử dụng thư viện đơn giản với hai hàm này (nhiều triển khai tồn tại: [1] (http://closure-library.googlecode.com/svn /docs/closure_goog_crypt_base64.js.source.html), [2] (http://code.google.com/p/stringencoders/source/browse/trunk/javascript/base64.js?r=230), [3] (https://bitbucket.org/davidchambers/base64.js/src), [4] (https://gist.github.com/1284012)). – c69

2

Linux base64 có một dòng mới ở cuối.

+0

Yea, do tiếng vang không -n, cảm ơn – psynnott

2

Đó là vì phiên bản Unix cũng mã hóa phần cuối của dòng.

Tiếp nhận hiệu ứng tương tự trong PHP bạn sẽ phải làm một cái gì đó như thế:

echo base64_encode('test'.PHP_EOL); 

mà sẽ đầu ra:

dGVzdAo= 

Xem bằng chứng đây: ideone.com/HorVD

EDIT: Như Charles đã đề cập, PHP_EOL là nền tảng cụ thể, vì vậy để kiểm tra ở trên trên Windows, bạn sẽ ha đã thay thế bằng biểu tượng cuối dòng giống Unix:

echo base64_encode("test\n"); 
+0

Xem ra, 'PHP_EOL' là * nền tảng cụ thể * và sẽ khác trên Windows. – Charles

+0

@Charles: Cảm ơn, tôi đã cập nhật câu trả lời của tôi với thông báo của bạn. Tôi mặc dù nó sẽ có ý nghĩa hơn, khi ông mã hóa kết thúc Linux với 'base64' của Linux, và sử dụng cuối cùng của nền tảng sẽ là thích hợp nhất. Tuy nhiên, tôi tự hỏi, nếu một cái gì đó tương tự là có thể trên Windows (ví dụ như sử dụng PowerShell ?, có thể với cú pháp khác nhau, nhưng cũng dẫn đến chuỗi đang được xử lý với kết thúc của dòng, nhưng lần này Windows 'một). – Tadeck

+0

Có vẻ như [base64ing có thể được thực hiện] (http://blogs.msdn.com/b/powershell/archive/2006/04/25/583265.aspx) trên các chuỗi trong PowerShell. Đánh giá từ thực tế là nó làm việc trên chuỗi thay vì trên đầu ra của một lệnh cụ thể, có * có lẽ * không có dòng mới lơ lửng ở đó phải lo lắng. – Charles

0

Giống như trên.

trong Mac OS X, chỉ cần kiểm tra điều này:

$ echo 'test' | cat -e 

test$ 

Hoặc,

$ echo -n 'test' | cat -e 

test 

Và, về lệnh echo, có thể thấy chóp:

echo -e option in ubuntu doesn't work

+0

Lý do dẫn đường qua mèo là gì? – psynnott

+0

@psynnott Chỉ để hiển thị một số chi tiết về lệnh 'echo'. – liuyu

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