2012-10-22 30 views
5

Tôi đang gửi qua một chuỗi gzipped từ C# (sử dụng SharpZipLib) đến PHP, nơi tôi giải nén với readgzfile. Điều này làm việc, tuy nhiên mỗi ký tự trong chuỗi được theo sau bởi hai ký tự lạ (sử dụng vim trong giao diện điều khiển được hiển thị là ^@). Tôi cũng đã thử với gzopen/gzread nhưng với kết quả tương tự.Trong PHP, mỗi ký tự trong chuỗi gz giải nén được theo sau bởi^@, tại sao?

Khi tôi xóa các ký tự không phải ASCII khỏi chuỗi bằng $clean= preg_replace('/[^(\x20-\x7F)]*/','', $string); thì chuỗi $ sạch sẽ giống với chuỗi trong C#.

Trong khi công việc này, tôi muốn biết điều gì đang xảy ra và tại sao tôi có thể đảm bảo điều này sẽ luôn hoạt động hoặc đưa ra giải pháp tốt hơn.

+4

Là chuỗi nguồn của bạn trong UCS2 hay UTF-16 có lẽ? – mario

+0

Tôi không áp dụng hoặc chuyển đổi sang một mã hóa cụ thể. Có lẽ tôi nên mặc dù, những gì tôi nên sử dụng mã hóa? – Whiskey

Trả lời

0

Cho rằng chuỗi được tạo trên Windows, có khả năng một số mã hóa nhiều byte đang được sử dụng.

Bạn có thể tự xác minh điều này bằng cách sử dụng bin2hex($string) và kiểm tra biểu diễn thập lục phân thay vì dựa vào vim.

Nếu một trong hai UTF-16 hoặc UCS2 đang được sử dụng, bạn có thể chuyển đổi chúng như vậy:

// iconv($from, $to, $str) 
$clean = iconv('UTF-16', 'UTF-8', $string); 
+0

Điều đó đã làm các trick, vì vậy tôi đoán nó sử dụng một trong hai. Cảm ơn. – Whiskey

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