內容

名稱

Encode::GSM0338 -- ETSI GSM 03.38 編碼

語法

use Encode qw/encode decode/;
$gsm0338 = encode("gsm0338", $unicode); # loads Encode::GSM0338 implicitly
$unicode = decode("gsm0338", $gsm0338); # ditto

說明

GSM0338 適用於 GSM 手機。雖然它與 ASCII 共用字母數字,但控制字元範圍和其他部分的對應方式非常不同,主要是為了儲存希臘字元。此外,還有跳脫序列 (以 0x1B 開頭) 來涵蓋例如歐元符號。

這曾經由 Encode::Bytes 處理,但由於所有這些不尋常的規格,Encode 2.20 已將支援轉移到這個模組。

這個模組僅實作 GSM 7 位元預設字母表GSM 7 位元預設字母表延伸表,根據標準 3GPP TS 23.038 版本 16。因此,國家語言單一轉換國家語言鎖定轉換 沒有實作或支援。

七位元組

這個模組使用八位元組 (就像任何其他 Encode 模組) 運作,而不是使用封裝的七位元組 (與其他 GSM 標準不同)。因此,對於處理二進位簡訊或 GSM TPDU 酬載的一部分 (3GPP TS 23.040),需要在八位元組和封裝的七位元組之間進行轉換。Perl 的 packunpack 函式可能對此目的很有用

$bytes = substr(pack('(b*)*', unpack '(A7)*', unpack 'b*', $septets), 0, $num_of_septets);
$unicode = decode('GSM0338', $bytes);

$bytes = encode('GSM0338', $unicode);
$septets = pack 'b*', join '', map { substr $_, 0, 7 } unpack '(A8)*', unpack 'b*', $bytes;
$num_of_septets = length $bytes;

請注意,對於封裝的七位元組的正確解碼,需要知道封裝在二進位緩衝區中的七位元組數量,因為二進位緩衝區總是使用零位元填充,而 7 個零位元代表字元 @。處理 3GPP TS 23.040 時,七位元組數量也儲存在 TPDU 酬載中。

錯誤

Encode::GSM0338 2.7 及更舊版本 (Encode 3.06 的一部分) 錯誤地處理零位元組 (字元 @)。這已在 Encode::GSM0338 版本 2.8 (Encode 3.07 的一部分) 中修正。

另請參閱

3GPP TS 23.038

ETSI TS 123 038 V16.0.0 (2020-07)

編碼