安全忽略未知的ANSI,ESC/P,ESC/POS序列,知道长度
Safely ignoring unknown ANSI, ESC/P, ESC/POS sequences, know the length
先了解一些上下文:
我正在制作一种将电子打字机转换为串行打字机的设备 printer/terminal。
(不要问为什么;我知道这实际上没有多大意义)
插入打字机控制器和键盘之间的设备。
它可以:
- 让键盘透明地通过,
- 获取按键,有或没有阻止打字机看到它们,
- 插入额外的按键。
有了这个我可以让打字机在不同的模式下工作:
- 普通打字机,
- 打字机,通过串行端口记录每个键入的字符,
- 串口打印机,
- 串行终端。
对于串行printer/terminal模式我想接受和理解一些ANSI(对于终端),ESC/P,ESC/POS(对于打印机)转义序列,取决于模式。
问题来了。由于设备有限,可以接受非常小的转义序列子集,这些转义序列可以在打字机上执行。我只想忽略任何不受支持的序列。
问题是序列的长度不同。
当一个无法识别的(设备)序列到达时,是否有一种通用的方法来确定该序列的字节数,以便我知道要忽略多少字符? (例如一些基于第一个字符的简单规则?)
或者我是否被迫为所有可能的序列准备一个长查找 table(这需要宝贵的闪存 space)以始终知道要忽略多少字节?
我想避免:
- 忽略序列后面的实际有效数据而不打印它
- 在纸上打印部分转义序列
- 将未知序列的部分解释为新序列的开始
当然,我可以定义自己的序列,但是我需要为我的设备定制一个驱动程序。我更喜欢使用现有标准。
编辑添加:
正如@Raymond Chen 在下面的评论中所示,对于 ANSI 序列,可以在它们终止的地方检测到。所以没有问题。但是对于 ESC/P 序列(在打印机模式下),我没有注意到类似的方式来了解它。
ESC/P和ESC/POS有EPSON的规格,但只是事实上的标准,不是标准化的。
其他厂商挪用他们不一定遵守,经常自己做扩展。
EPSON本身也做了各种扩展,有ESC/P2、ESC/Page和ESC/Label(Zebra-ZPLII兼容?)等规格。
例如这里是ESC/POS
ESC/POS Command Reference for TM Printers
这里是 ESC/P。
EPSON ESC/P Reference Manual
如果你去别处看看,你会找到这些。
ESC/P - Wikipedia
ESC/P 2 and FX Commands
ESC/Label Command Reference Guide - Epson
Esc/Pageコマンドリファレンス第4版需要注册会员。
对它们的解释有松散的启发式格式,但不会有适用于所有人的严格标准化规则。
无论你是想稳定地解释所有文档化的命令,还是在一定程度上支持它们而放弃细节,你有很多选择。
像这样的工具可能很有名。
ESC/POS command-line tools
Included utilities
esc2text
esc2text
extracts text and line breaks from binary ESC/POS files.
还没完,我自己在做这样一个工具
EscPosUtils
搜索一下,还有其他类似的工具。
先了解一些上下文:
我正在制作一种将电子打字机转换为串行打字机的设备 printer/terminal。
(不要问为什么;我知道这实际上没有多大意义)
插入打字机控制器和键盘之间的设备。
它可以:
- 让键盘透明地通过,
- 获取按键,有或没有阻止打字机看到它们,
- 插入额外的按键。
有了这个我可以让打字机在不同的模式下工作:
- 普通打字机,
- 打字机,通过串行端口记录每个键入的字符,
- 串口打印机,
- 串行终端。
对于串行printer/terminal模式我想接受和理解一些ANSI(对于终端),ESC/P,ESC/POS(对于打印机)转义序列,取决于模式。
问题来了。由于设备有限,可以接受非常小的转义序列子集,这些转义序列可以在打字机上执行。我只想忽略任何不受支持的序列。
问题是序列的长度不同。
当一个无法识别的(设备)序列到达时,是否有一种通用的方法来确定该序列的字节数,以便我知道要忽略多少字符? (例如一些基于第一个字符的简单规则?)
或者我是否被迫为所有可能的序列准备一个长查找 table(这需要宝贵的闪存 space)以始终知道要忽略多少字节?
我想避免:
- 忽略序列后面的实际有效数据而不打印它
- 在纸上打印部分转义序列
- 将未知序列的部分解释为新序列的开始
当然,我可以定义自己的序列,但是我需要为我的设备定制一个驱动程序。我更喜欢使用现有标准。
编辑添加: 正如@Raymond Chen 在下面的评论中所示,对于 ANSI 序列,可以在它们终止的地方检测到。所以没有问题。但是对于 ESC/P 序列(在打印机模式下),我没有注意到类似的方式来了解它。
ESC/P和ESC/POS有EPSON的规格,但只是事实上的标准,不是标准化的。
其他厂商挪用他们不一定遵守,经常自己做扩展。
EPSON本身也做了各种扩展,有ESC/P2、ESC/Page和ESC/Label(Zebra-ZPLII兼容?)等规格。
例如这里是ESC/POS
ESC/POS Command Reference for TM Printers
这里是 ESC/P。
EPSON ESC/P Reference Manual
如果你去别处看看,你会找到这些。
ESC/P - Wikipedia
ESC/P 2 and FX Commands
ESC/Label Command Reference Guide - Epson
Esc/Pageコマンドリファレンス第4版需要注册会员。
对它们的解释有松散的启发式格式,但不会有适用于所有人的严格标准化规则。
无论你是想稳定地解释所有文档化的命令,还是在一定程度上支持它们而放弃细节,你有很多选择。
像这样的工具可能很有名。
ESC/POS command-line tools
Included utilities
esc2text
esc2text
extracts text and line breaks from binary ESC/POS files.
还没完,我自己在做这样一个工具
EscPosUtils
搜索一下,还有其他类似的工具。