#860 GSM-7 编码

2023-01-05

https://en.wikipedia.org/wiki/GSM_03.38

GSM 引入短信服务的时候,规范了相关的字符编码。

其中,定义了一个 7bit 的字符编码,支持英语和一些西欧语言,这套标准就是 GSM 03.38,也被称之为 3GPP 23.038,在移动通信技术领域之外,更广泛的称呼是 GSM-7 编码(gsm7bit)。

  • PS:短信中如果要包含其他语言,必须使用 16 位 UCS-2 字符编码进行传输。
  • PS:按照 GSM 03.40 标准(TP-Data-Coding-Scheme),一共支持三种编码(00 GSM7bit,01 8bit,02 UCS2)
  • PS:3GPP 23.038 中还又定义一个 national language shift table,
    可以通过相关代码在 GSM-7 的技术框架内支持一些语言,比如葡萄牙语、西班牙语、土耳其语等。
    中文这种字符这么多的就别想了。

字符集

分析

  1. 算是可变长度编码,拓展区域字符需要用 ESC (0x1B) 开头,算两位长度。

  2. ASCII 可打印字符中(Python string.printable),有四个不支持:

`
\t      # TAB   水平制表符
\x0b    # VT    垂直制表符
\x0c    # FF    换页
  1. GSM-7 基本兼容同为七位编码的 ASCII:

  2. ASCII 可打印字符中,有 8 个符号放在拓展区,

  3. 其他的和 GSM-7 编码完全相同。
^ ~ \ | { } [ ]
  1. 图中标黄色的 7 个字符说明:

  2. BCS:

    1. LF \r 换行
    2. CR \n 回车
    3. ESC
    4. SP
  3. EXT:

    1. FF 1B0A 对应 ASCII 0C 位置的换页符
    2. CR2 1B0D
    3. SS2 1B1B 保留
  4. GSM-7 用控制字符换了以下 40 个字符:

'£', '¥', 'è', 'é', 'ù', 'ì', 'ò', 'Ç', 'Ø', 'ø',
'Å', 'å', 'Δ', 'Φ', 'Γ', 'Λ', 'Ω', 'Π', 'Ψ', 'Σ',
'Θ', 'Ξ', 'Æ', 'æ', 'ß', 'É', '¤', '¡', 'Ä', 'Ö',
'Ñ', 'Ü', '§', '¿', 'ä', 'ö', 'ñ', 'ü', 'à', '€',

对短信长度计算的影响

和 8bit 的 ASCII 编码方案相比:

  1. 利用那些没有用的控制位,支持更多语言(同时,牺牲了 8 个标点符号,需要两个字节表示)
  2. 140 * 8 / 7 = 160,也就是一条短信支持的字符数,从 140 提升到 160。

如果超出就按照 153 个字符切割,比如:

500 个 GSM-7 字符的短信,在通信过程中需要切割成 153 + 153 + 153 + 41 四条短信发出。
每条短信带一个头(附加信息),包含这批短信的总条数和当前这条短信的序号。
收信方根据短信的头信息来把这一批短信组装成一条,展示给用户。

参考:2018/06/08,短信长度到底是怎么规定的

填充位

根据协议:
如果剩余长度 1 ~ 6,最后的几位应该用 0 填充。
如果剩余长度位 7,为了避免和 0x00 @ 混淆,应该用 0x0D 填充,也就是 \r(回车)。

stat = {}

for i in range(1, 161):
    stat.setdefault(8 - (i * 7 % 8), []).append(i)

pprint.pp(stat, width=160)
{1: [1, 9, 17, 25, 33, 41, 49, 57, 65, 73, 81, 89, 97, 105, 113, 121, 129, 137, 145, 153],
 2: [2, 10, 18, 26, 34, 42, 50, 58, 66, 74, 82, 90, 98, 106, 114, 122, 130, 138, 146, 154],
 3: [3, 11, 19, 27, 35, 43, 51, 59, 67, 75, 83, 91, 99, 107, 115, 123, 131, 139, 147, 155],
 4: [4, 12, 20, 28, 36, 44, 52, 60, 68, 76, 84, 92, 100, 108, 116, 124, 132, 140, 148, 156],
 5: [5, 13, 21, 29, 37, 45, 53, 61, 69, 77, 85, 93, 101, 109, 117, 125, 133, 141, 149, 157],
 6: [6, 14, 22, 30, 38, 46, 54, 62, 70, 78, 86, 94, 102, 110, 118, 126, 134, 142, 150, 158],
 7: [7, 15, 23, 31, 39, 47, 55, 63, 71, 79, 87, 95, 103, 111, 119, 127, 135, 143, 151, 159],
 8: [8, 16, 24, 32, 40, 48, 56, 64, 72, 80, 88, 96, 104, 112, 120, 128, 136, 144, 152, 160]}

参考资料与拓展阅读

#859 我的工作日志

2023-01-04

之前的工作日志

  1. 按年按月归档的,每周一个文件,然后专门的事情可能会有一个专门的文件来记录。
work
    2022
        README.md
        01
        02
        ...
        12
            202212-05-11.md
            202212-12-18.md
            202212-19-25.md
            202212-26-01.md
            20221201-speedlimit-review.md
            20221203-new-from-test.md
            ...
            20221229-q4-report.md
  1. 每周的事情又分成:

  2. 值班报告

  3. 工作事项(按天记录)
  4. 周会汇报

    • 上周工作总结
    • 本周工作安排
    • 接下来的计划
  5. 每年的文件中有每个季度重要工作的总结,Q1 ~ Q4

今后的调整

  1. 在年度目录中增加 q1.md ~ q4.md 做季度计划和总结
  2. 在月度目录中增加 README.md 做月度计划和总结
  3. 年度计划和季度计划中,用二级标题记录相关事项,和每周工作实施情况相关联。
  4. 工作事项要区分产品线,区分事项类型(客户问题,功能开发,Bug修复,协助,其他)
  5. 工作计划中要区分主线任务,支线任务
  6. 主线任务是列在年度计划、季度计划中的重点事项,以及其他重点事项
  7. 支线任务是平时的开发任务和其他事项
  8. 工作安排中要关注重点数据(包括大客户的信息)
  9. 周末总结留到当前周的文件中(由于每周一有周会汇报,很多时候都是周一上午编辑整理,所以之前是放到下一周)
  10. 本周工作总结
  11. 下周工作安排
  12. 接下来的计划

#858 dd 替代品

2022-12-25
dd if=image.iso of=/dev/sdb bs=4M

# 用 cat 就行:
cat image.iso >/dev/sdb
# 如果想要进度信息:
cat image.iso | pv >/dev/sdb

dd if=/dev/zero of=image.iso bs=4MB count=25
# 用 head:
head -c 100MB /dev/zero >image.iso

参考:https://eklitzke.org/the-cult-of-dd

#857 Python 2.7 Json 字符串类型的问题

2022-12-19

今日发现一个 Python 2.7 的一个大坑:部分版本下 JSON 解析字符串为 str 类型,部分版本解析成 unicode 类型。

Python 2.7 (r27:82500, Apr 12 2016, 21:09:36)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-16)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import json; print(repr(json.loads('"a"')));
'a'

Python 2.7.15 (default, Jul 22 2019, 17:38:55)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import json; json.loads('"s"'); exit();
's'

Python 2.7.15 (default, Jun 26 2018, 11:17:18)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-17)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import json; json.loads('"s"'); exit();
u's'

Python 2.7.18 (default, Mar 23 2022, 15:07:54)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import json; json.loads('"s"'); exit();
u's'

找到一个相关的 Issue:json.loads() on str should return unicode, not str
对应 GitHub 上的 Issue#54247

根据相关内容,这个问题影响了 Python 2.7 的一些版本。


还有:json.loads() returns str instead of unicode for empty strings
对应 GitHub 上的 Issue#56191

#856 bash 上下键搜索历史记录

2022-12-16

我一直用 zsh + omz,但是毕竟 bash 才是大多数情况下的默认 Shell。

zsh 和 bash 都是用上下键来搜索历史记录,但是不同的是,zsh 会利用已经输入部分做前缀匹配,而 bash 不会,只是简单的上一条、下一条。

今天学会一个方法(Bash history search, partial + up-arrow):

bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'

凑活凑活吧。

已经加到我个人的 bash 配置中。

#855 Golang 变量初始化顺序问题

2022-12-15

f1.go

package main

var A int = 3
var B int = A + 1
var C int = A

f2.go

package main

import "fmt"

var D = f()

func f() int {
    A = 1
    return 1
}

func main() {
    fmt.Println(A, B, C)
}

执行

markjour@victus ~/test02
$ go version
go version go1.18.6 windows/amd64

markjour@victus ~/test02
$ go run f1.go f2.go
1 4 3

markjour@victus ~/test02
$ go run f2.go f1.go
1 2 3

分析

f1f2 的情况下:变量初始化的顺序应该为 A B C D,所以输出 1 4 3 是没有问题的。
f2f1 的情况下:变量初始化的顺序应该为 A D B C,所以按理应该输出 1 2 1,实际确实输出 1 2 3。

f1 中 A C 中只要一个的初始化改成这样就可以符合预期:

func initA() int {
    return 3
}

func initC() int {
    return A
}

这是 Go 的一个 BUG,即将在 Go 1.20 修复。
知道就行了。

参考资料与拓展阅读

#854 疫情的影响

2022-12-13

封控

由于疫情的封控措施导致官民矛盾非常激烈,到处都是对抗。
我自己小区就有暴力冲突,社区工作人员和物业保安群殴 “闯岗” 租户。我所知道的周边小区也是差不多。其他的某些地方甚至是聚集性的大事件(抖音删帖非常严重)。
这些 “小浪花” 单独拿出来,可能觉得是和物业在斗争、和大白在斗争、和社区工作人员在斗争,实际上背后是对镇府不作为,不敢担当的不满。

市镇府肯定知道下面的情况,可是没有做任何干涉。在一定程度上我能理解,一方面上面有这 m 条、那 n 条,要求 “精准防控”,尽可能开放,一方面又对防疫不力的地方杀鸡儆猴(就没见到几个因为过度防控而收到严厉处分的)。

但是:

第一,居委会作为居民自治组织,没有执法权,将居委会推到一线,给大家封路、封门、钉板子,凭什么。

第二,没有人能够出具有法律效力的(带公章)文件要求封控,经常就是群里发个消息,可能再带一张居委会的 A4 扫描件,也没有公章。问就是上级单位。

第三,小区封控起来之后,物质的供应方面,镇府没有任何作为。
本来我们都在小区铁门内买,门外门店老板递过来,结果工商(?)的一天查几次,要求他们关门,所以经常要到处找哪里有卖菜的地方。
我在买菜的时候,还听到一起买菜的人在说,工商要我们在家吃几天面条挺过去。
本来大部分人都不用和镇府打交道,因为疫情防控的关系,大家直接面对面了。

还有,大家在传核酸企业的一些传闻,这个我不了解情况,就不评论了,但是证监会给他们上市割韭菜的机会是为什么?

注:如果要出小区,需要社区出具的一个小纸条,注明原因,承诺两点一线,物业的检查方面也非常松,基本上是看到拿出来一个纸条就放行,并且没有时间限制。

解封

上面是之前的情况,最近这两天风向来了个 180° 的大转弯。之前是应检尽检,一天几次的在小区群里催大家下楼做核酸。突然一声不吭,

  1. 做不做核酸都是绿码了,同样没有见到官方的任何说法。
  2. 一天之内开始拆除所有路障。
  3. 减少撤销小区周边的便民检测点,残存的几个检测点还在大喇叭喊话,如果没有必要尽量不要做核酸(混管),不要连累家人邻居被封。
  4. 又两三天之后,所有地方都开始强调不检查核酸绿码了。

感染

再就是身边慢慢星星点点听说有人发烧、有人自测阳性。
药店基本上感冒发烧消毒的东西,啥都没有,只能靠自己挺了。镇府在这方面(医药供应)还是啥都没作为。服了。

之前新闻联播里面天天说美国新冠的情况,现在也不提了。
之前说新冠好像非常严重,现在说是和感冒差不多,可以自己挺过去。
之前强调防控是保障人民的生命权,现在说放开是精准调研之后选择的最好时机。

现在这种从上到下都紧跟 ZZ 形势说话的氛围,做没有脑子的咽喉,让人挺没有信任感的。
虽然表面上看不太出来,但是从长远来讲,这都是信心的流失。

最重要的还是期间各级镇府的不作为。在不违反规定的情况下,其实有好多事情可以做,那样的话,也不会是现在这个局面。

#853 街道,社区,居委会?

2022-12-01
  • 街道,街道办事处,相当于乡政府,镇政府

  • 工作人员是事业编制,少部分是公务员

法律依据:

  • 《地方各级人民代表大会和地方各级人民政府组织法》第六十八条规定:
    > 市辖区、不设区的市人民政府,经上一级人民政府批准,可以设立若干个街道,管理机构为街道办事处,作为市辖区、不设区的市的派出机关。

  • 居委会,居民委员会,相当于村委会(村民委员会)

  • 又叫社区居民委员会,简称社区。(?)

  • 在街道和更高级别政府的指导下工作。
  • 理论上,居委会应该是居民自治组织,其领导班子应该由辖区居民选举产生。

法律依据:

  • 《中华人民共和国城市居民委员会组织法》

  • 业委会,业主委员会,小区自行选举代表业主利益的组织。管理小区公共利益,监督物业公司的工作。

  • 选举需要经过街道和社区批准。

法律依据:

  • 《中华人民共和国民法典》
  • 《业主大会和业主委员会指导规则》(建房[2009]274号)

参考资料与拓展阅读

  1. 网易,未经批准擅自组织业委会选举,临沂2人被刑拘!

...,在未经街道办事处和社区组织批准的情况下,...

  1. 北京市人民政府,社区和居委会的区别是什么?
    IMG

#852 Beyond Compare 试用到期的问题

2022-11-30

LOGO

BComp 之前过期也可以一直用,只是提示一下,现在不行了。
这是我在 Windows 平台上非常习惯了的一个工具。

作为一个做软件开发的人,搞这种歪门邪道,我还是会有罪恶感的,所以点进去看了一下官方售价,70 刀,瞬间没有罪恶感了。


网上找了几个注册密钥,都提示 “授权密钥已被吊销”,然后看到这个方法,亲测有效:

在注册表中删除这个条目:HKEY_CURRENT_USER\Software\Scooter Software\Beyond Compare 4\CacheId 就行。


如果不知道我上面说的时什么意思,就把下面这段代码保存为 bcompAddTime.bat,双击执行。
如果提示 “没有适当的权限访问该项目”,就右键,管理员身份运行。

@echo off

echo
echo 开始删除 =====================================================================
echo
reg delete "HKCU\Software\Scooter Software\Beyond Compare 4" /v CacheID /f
echo
echo 删除完成 =====================================================================
echo

reg query  "HKCU\Software\Scooter Software\Beyond Compare 4"

pause

#851 短信类型

2022-11-28
  • 短信,Short Message/Messaging Service,SMS

    • 1986 年 GSM 协议的一部分,最大允许 140 字节。
  • 彩信,多媒体短信,Multimedia Messaging Service,MMS

    • 支持文字,图片,音频
    • 支持 300KB 内容(由运营商和手机终端双方面决定的)

    Although the standard does not specify a maximum size for a message, 300 kB and 600 kB are the recommended sizes used by networks for compatibility with MMS 1.2 and MMS 1.3 devices respectively.
    The limit for the first generation of MMS was 50 kB.

    MMS 依赖 WAP。
    发送彩信的时候,内容编码之后投递给多媒体消息服务中心(MMSC)(如果跨运营商,会中转到收信人运营商 MMSC)。
    收信人运营商会确认设备是否支持 MMS,如果支持,就发送一个 WAPPush 通知,内容就是一个 URL,也就是才新内容的地址。
    一般来说,默认都是需要收信人手动确认是否接收,如果同意接收就会连上 URL 下载内容在手机端浏览。(网页?)

  • 闪信,Flash SMS

    • 似乎有地方称之为屏信,展信
    • 经常是政府机关或者运营商用来发送通知、提醒(如果用作营销就太恶心了)
    • 可能存在的问题:部分机器不支持闪信,闪信相互覆盖
    • 和 SMS 不同,据说是跟 USSD 有关
    • 又有资料说是只有短信头不同,存疑,如果是的话,为什么没有看到伪基站大量投递闪信
    • 根据网上的资料,CMPP 协议支持发闪信
  • 影信,视频短信

    • 彩信升级版,支持:文字,图片,视频,音频

      • 支持视频
      • 支持最大 1.8M 的富媒体内容 (有的说 1.85M,有的说 1.9M,有的说 2M)
      • 不算收信方流量费用(发信方付费)
      • 不对个人开放,需要企业资质审核
    • 阿里云叫做数字短信,和卡片短信(就是下面的 AIM 短信)一起被归类到多媒体短信中。

      短信内容不支持纯文字或纯视频或纯图片或纯音频,模板须大于 660 KB。
      图片+音频+视频+文本须小于 1900 KB,超过后不支持。

    • 燃信,中国移动的营销概念,就是视频短信,加上了一点卖用户数据的成分在里面(实名认证,用户画像)。

  • 富信,富媒体短信,Rich Communication Services,RCS

    • 同样也是 GSMA 推出的协议(GSMA RCS UP 标准),2019 年成为 5G 标准的一部分。
    • 文字,图片,音频,视频,地理位置,文件等,几乎微信可以发送的消息,这里都支持。
    • 根据维基百科,RCS 可能也被称之为 Advanced Messaging,Chat,joyn,SMSoIP,Message+,SMS+。
    • 【澎湃新闻】当地时间 12 月 2 日,谷歌发文庆祝短信问世 30 周年,称现在应转用富媒体通信(RCS),并顺便挖苦不支持 RCS 的苹果“消息功能还活在 30 年前”。
      PS:苹果不支持 RCS。
  • 5G 消息,5G 短信,RCS 的国内名称,其实和 5G 技术没有一毛钱关系,只是和运营商的 5G 业务绑定在一起

    • 几大运营商都在推,试图将短信服务打造成微信(这么牛 B 的愿景,为什么我一点都没有感受到)
    • 不走短信网关,走互联网。如果网络有问题,有回退方案,就是下面的 AIM 这种。
    • 2020 年 4 月 8 日,中国移动、中国电信、中国联通携手 11 家合作伙伴共同发布《5G 消息白皮书》,三大运营商计划在 2020 年内推出 5G 消息。
    • 2020 年 5 月 10 日,5G 消息 APP 上架。5 月 11 日,5G 消息 APP 因技术原因暂时下架。
    • 2020 年 12 月 22 日,短信业务升级为 5G 消息,无需下载客户端,就可实现“消息即服务”。
    • 2022 年 1 月 25 日,中国电信 5G 消息正式商用。
    • 目前存在的问题:收费(他们的脑子是咋想的?);运营商和手机厂家各怀鬼胎;短信服务早已沦为接受验证码的工具,互联网即时通讯服务的城墙已经非常高了。
  • AIM 短信,智能短信,智慧短信,手机上的短信应用将普通文本短信渲染成更丰富的样式,还有交互的功能,可以打开轻应用,应用,H5 页面,拨号,打开地图等。

    • 需要手机厂商支持
    • 根据网上的资料,可能是深圳梦网推出的。
    • 华为云智能短信 是一回事么?说是覆盖安卓生态。
    • 又看到一种新称呼:5G 阅信

参考资料与拓展阅读