# 语法版本与字符配置

本版支持批量语法版本 3 的一个交换，包含一条或多条直接消息。UNB 的首数据元必须为四字母标识 `UNOA` 或 `UNOB`、组件分隔符、单字节版本 `3`；不对未知配置猜测解码。

| 配置 | 接受的值字节 |
|---|---|
| UNOA:3 | `A-Z`、`0-9`、空格及 `. , - ( ) / =`；声明的服务字符按下述转义规则处理 |
| UNOB:3 | ASCII `0x20..0x7E` 的可打印子集；声明的服务字符按下述转义规则处理 |
| 其他 UNOx、非 ASCII 字节 | `S_CHARSET_UNSUPPORTED` 或 `S_CHARACTER_INVALID` |
| 其他语法版本，包括 4 | `S_VERSION_UNSUPPORTED` |

UNOB 的限定支持不包括控制字符、多字节编码或完整扩展字符集。段标识须为三个大写 ASCII 字母，未知业务标识允许保留。

## UNA 与默认值

如果有 UNA，必须位于输入 byte 0，后面固定六个服务字符；UNA 自身共九个字节。默认配置也使用下面六个位置：

| UNA 内位置 | 输入偏移 | 作用 | 默认 byte |
|---|---:|---|---|
| 1 | 3 | 组件分隔符 | `:` (58) |
| 2 | 4 | 数据元分隔符 | `+` (43) |
| 3 | 5 | 小数符号 | `.` (46) |
| 4 | 6 | release | `?` (63) |
| 5 | 7 | 版本 3 保留位置 | 空格 (32) |
| 6 | 8 | 段终止符 | `'` (39) |

五个活动服务字符须互不相同，且为非空格、非字母数字的 ASCII 可打印标点；小数符号只能为点或逗号。版本 3 的第 5 位必须为空格。版本 4 的 `*` 重复项示例先得到版本不支持诊断，不套用版本 3 的保留位解释。

可接受 `UNA;*,! ~` 等自定义配置，实际双消息样本见 `testdata/custom-una-two.edi`。小数符号记录在 profile 中，解析器不计算数值或校验业务数值格式。

CR/LF 可以出现在 UNB 前（没有 UNA 时）、UNA 后或段间，且原始偏移保持不变。UNA 前的 CR/LF、BOM、标签中的空白和数据值中的 CR/LF 不接受。尾随 CR/LF 可以存在。

## Release 与空值

release 只允许紧接组件、数据元、小数、release 或终止服务字符。`?+`、`?:`、`?'`、`??`、`?.` 分别成为一个逻辑字节；普通字母前的 `?` 是 `S_RELEASE_INVALID`，末尾悬空的 `?` 是 `S_RELEASE_TRUNCATED`。

相邻分隔符产生显式空值。`XYZ'` 没有数据元；`XYZ+'` 有一个数据元和一个空组件；`XYZ++A::B'` 保留空数据元以及中间空组件。源区间仍包含原始 release 字节，逻辑值不包含 release。

## 服务封套检查

支持 `UNB → (UNH → 业务段* → UNT)+ → UNZ`。消息可只有 UNH 和 UNT；UNT 的段数包括这两个服务段，UNZ 的数量为直接 UNH 数量。

检查 UNB 的发送者、接收者、日期/时间两组件与交换引用存在；检查 UNH 的消息引用及消息类型、版本、发布号、机构四组件存在；UNT/UNZ 必须恰含计数和引用两个简单数据元。引用长度限定 1～14 个逻辑字节，计数限定 1～6 个十进制数字，并校验匹配和消息引用唯一性。

其他可选服务字段保留为通用元素。本版不检查日期是否合法、不完整验证发送者标识/可选字段格式、不装载消息目录，也不校验业务类型标识的目录含义。功能组、交互式服务段与第二个交换均返回失败；拒绝路径见诊断代码表。
