我想为文件格式编写语法,其内容可以包含
然而,没有一个RFC 5234和7405对不使用US ASCII的人非常友好。
事实上,我正在寻找一个ABNF版本(也可能是一些基本规则),它是面向字符而不是面向字节的; RFC 5234唯一要说的就是2.4节:
2.4. External Encodings
External representations of terminal value characters will vary
according to constraints in the storage or transmission environment.
Hence, the same ABNF-based grammar may have multiple external
encodings, such as one for a 7-bit US-ASCII environment, another for
a binary octet environment, and still a different one when 16-bit
Unicode is used. Encoding details are beyond the scope of ABNF,
although Appendix B provides definitions for a 7-bit US-ASCII
environment as has been common to much of the Internet.
By separating external encoding from the syntax, it is intended that
alternate encoding environments can be used for the same syntax.
这并没有真正澄清事情。
ABNF的某个版本是面向代码点而不是面向字节的吗?
答案 0 :(得分:2)
请参阅section 2.3 of RFC 5234,其中说明:
规则解析为一串终端值,有时称为 字符。在ABNF中,字符仅仅是非负整数。 在某些上下文中,将值特定映射(编码)为a 将指定字符集(例如ASCII)。
Unicode只是一组非负整数U + 0000到U + 10FFFF减去代理范围D800-DFFF,并且有各种各样的RFC相应地使用ABNF。一个例子是RFC 3987。
答案 1 :(得分:1)
如果您正在编写的ABNF用于人类阅读,那么我会说使用正常语法并参考代码点而不是字节。您可以查看允许源文本中的Unicode的各种语言规范,例如: C#,Java,PowerShell等。它们都有语法,它们都必须在某处定义Unicode字符(例如标识符)。
E.g。 PowerShell语法有这样的行:
双引号字符:
"
(U+0022
)
左双引号(U+201C
)
右双引号(U+201D
)
双低9引号(U+201E
)
或者在Java规范中:
UnicodeInputCharacter:
UnicodeEscape
RawInputCharacterUnicodeEscape:
\
UnicodeMarker HexDigit HexDigit HexDigit HexDigitUnicodeMarker:
u
UnicodeMarkeru
RawInputCharacter:
任何Unicode字符HexDigit:之一
0 1 2 3 4 5 6 7 8 9 a b c d e f A B C D E F
这里的
\
,u
和十六进制数字都是ASCII字符。
请注意,周围的文字解释了意图 - 这总是比向某人倾倒一堆语法更好。
如果是自动解析器生成,您可能最好找一个允许您以Unicode和ABNF形式指定语法的工具,然后发布它。但是,编写解析器的人应该也应该理解。