2011-12-24 75 views
2

我有一個小麻煩二郎神給我一個unicode字符串。二郎,io_lib和Unicode

這裏是什麼工作:

io:format("~ts~n", [<<226,132,162>>]).

ok

但不是打印到控制檯,我想將其分配給一個變量。因此,我認爲:

T = lists:flatten(io_lib:format("~ts~n", [<<226,132,162>>])).
T.
[8482,10]

我怎樣才能Tio_lib例子包含符號,所以我可以把它寫入網絡流?

+0

你的二進制'<<226,132,162>>'不是unicode字符串而是** UTF-8編碼的Unicode **串。從'io_lib:format/2'返回的列表是一個unicode代碼點列表。 – rvirding 2011-12-26 14:29:27

回答

4

而不是將展平版本分配給在網絡上發送的變量,而是可以重新編寫通過網絡發送的代碼,以首先接受二進制文件,並在發送時使用格式化的寫入機制~ts套接字?

這也將讓你避免lists:flatten,這是不需要內置IO機制。

+0

我喜歡它,這是可能的,但更重要的是重寫比我計劃。這是唯一的選擇嗎? – marcc 2011-12-24 04:48:28

+0

我不能說它是否是唯一的選擇;希望有更多Erlang經驗的人會知道是否有更適合您的案例的選項是可能的。 – sarnold 2011-12-24 04:53:06

+3

首先要知道你需要做什麼。您只能通過網絡發送字節,因此由碼字組成的可能大於255的Unicode字符串需要由發送端進行編碼並由接收端進行解碼。 UTF-8是Unicode字符串最常用的編碼,這就是你出io_lib通話。通過網絡發送unicode字符串的一種非常合理的方式是使用UTF8編碼它們。 不要使用io_lib:格式,雖然。 Unicode:當characters_to_binary/1意味着UTF-8編碼的二進制文件 – 2011-12-29 06:42:04

5

它確實包含商標符號:你可以看到here,8482是它的代碼。它不是作爲™打印在外殼中的,因爲外殼打印爲只包含拉丁語-1中可打印字符代碼的字符串。所以[8482, 10]一個Unicode字符串(UTF-32編碼)。如果您想將其轉換爲其他編碼,請使用unicode模塊。

5

第一件事是知道自己需要做什麼。然後,您可以調整您的代碼,找到最佳方式。

二郎表示Unicode字符串作爲碼點的名單。 Unicode代碼點是整數,而不是字節。因此,您只能通過網絡發送字節,像unicode字符串之類的東西需要由發送端以字節序列進行編碼,並由接收端進行解碼。 UTF-8是Unicode字符串最常用的編碼,這就是你的二進制文件是什麼,由碼點組成的unicode字符串的UTF-8編碼8482.

什麼你走出io_lib:format通話的是Erlang的字符串該代碼點的表示加上新的行字符。

一個非常合理的方式通過網絡發送的Unicode字符串是UTF-8編碼它們。不過,請不要使用io_lib:formatunicode:characters_to_binary/1是用於轉換UTF-8編碼二進制文件中的unicode字符串的函數。

在接收方(並可能在整個應用程序甚至更好),你必須決定你將如何處理字符串,無論是在編碼的二進制文件(或清單)或純unicode的名單。但在網絡上,唯一的選擇是使用二進制文件(或者可能是深度字節列表的iolist),我敢打賭你的應用程序的最合理的編碼將是UTF-8。