内容

名称

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 已将支持转移到此模块。

此模块仅根据标准 3GPP TS 23.038 版本 16 实现GSM 7 位默认字母表GSM 7 位默认字母表扩展表。因此,国家语言单字节移位国家语言锁定移位未实现也不支持。

七位字节

此模块使用八位字节(与任何其他 Encode 模块一样),而不是使用打包的七位字节(与其他 GSM 标准不同)。因此,为了处理二进制 SMS 或 GSM TPDU 负载(3GPP TS 23.040)的部分,需要在八位字节和打包的七位字节之间进行转换。为此,perl 的 `pack` 和 `unpack` 函数可能会有用。

$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)

Encode