Internationalization 使用多语言字段增强ASCII协议

Internationalization 使用多语言字段增强ASCII协议,internationalization,protocols,Internationalization,Protocols,我正在增强一个软件,它实现了一个简单的基于ASCII的协议 协议很简单。。。下面是一个消息看起来有点像的示例(虽然不一样,但我无法向您展示真正的协议): auth11200 我们得到的反应与 230 DEVICE 1 STATE AUTH 200 OUTPUT 1 NAME "Photo Black"<CR><LF> 230设备1状态认证200输出1名称“照片黑” 名称“Photo Black”来自一个数据库sqlite数据库。我需要增强它以支持外语。所以我一直认为

我正在增强一个软件,它实现了一个简单的基于ASCII的协议

协议很简单。。。下面是一个消息看起来有点像的示例(虽然不一样,但我无法向您展示真正的协议):

auth11200
我们得到的反应与

230 DEVICE 1 STATE AUTH 200 OUTPUT 1 NAME "Photo Black"<CR><LF>
230设备1状态认证200输出1名称“照片黑”
名称“Photo Black”来自一个数据库sqlite数据库。我需要增强它以支持外语。所以我一直认为字段“Photo Black”需要“可选地”编码为引号之间的UTF-8字符串。我想知道是否有这样的标准,以便客户端应用程序可以解释引号中的字符串,并立即将其识别为UTF-8或纯ASCII。我不愿意重写协议,那太麻烦了。只需插入某种编码,客户就可以识别一些西班牙语或瑞典语的名字


我也不希望这个字段总是被解释为UTF-8,说来话长。您知道C++中如何键入0xFF,编译器知道这是十六进制字符串…UTF-8是否有等效物?对不起,我可能是在开玩笑,但我对UTF-8编码和国际化一般都不太熟悉。

请阅读Ascii兼容编码或ACE的概念。iDNS就是一个例子。UTF-7也是如此

这是我的发言稿


你真的不能在UTF-8中进行代码切换。关于噩梦,请查阅ISO-2022,它试图支持这类事情。还请记住,UTF-8包括ASCII,但不包括拉丁语-1。

阅读ASCII兼容编码或ACE的概念。iDNS就是一个例子。UTF-7也是如此

这是我的发言稿


你真的不能在UTF-8中进行代码切换。关于噩梦,请查阅ISO-2022,它试图支持这类事情。还要记住,UTF-8包括ASCII,但不包括拉丁语-1。

您可以同时控制服务器和客户端吗?否则,您无法更改协议,因此无法执行此操作。当你说你“不打算重写协议”时,你至少要在某种程度上这样做。无论你做什么,你都会改变协议

我不确定为什么您也不希望总是将数据解释为UTF-8—如果它当前仅为ASCII,那么始终将其解释为UTF-8将是完全向后兼容的,因为所有ASCII在UTF-8中的编码方式相同。也许如果你能提供更多的信息,我们可以提供更多的帮助

您可以为UTF-8编码字符串引入前缀,例如U:

230 DEVICE 1 STATE AUTH 200 OUTPUT 1 NAME U"Photo UTF-8 stuff here Black"<CR><LF>
230设备1状态认证200输出1名称U“照片UTF-8黑色”
那会有帮助吗


您实际上有8位数据路径吗?如果有什么东西会损坏每个字节的顶部,那么你需要考虑选项而不是UTF-8。

< P>你对服务器和客户端都有控制吗?否则,您无法更改协议,因此无法执行此操作。当你说你“不打算重写协议”时,你至少要在某种程度上这样做。无论你做什么,你都会改变协议

我不确定为什么您也不希望总是将数据解释为UTF-8—如果它当前仅为ASCII,那么始终将其解释为UTF-8将是完全向后兼容的,因为所有ASCII在UTF-8中的编码方式相同。也许如果你能提供更多的信息,我们可以提供更多的帮助

您可以为UTF-8编码字符串引入前缀,例如U:

230 DEVICE 1 STATE AUTH 200 OUTPUT 1 NAME U"Photo UTF-8 stuff here Black"<CR><LF>
230设备1状态认证200输出1名称U“照片UTF-8黑色”
那会有帮助吗


您实际上有8位数据路径吗?如果有什么东西会使每个字节的顶部都变满,那么你就需要考虑一些选项,而不是UTF-8。

< P >为什么你不想把这个字段“总是解释为UTF-8”?你没说


如果您确实让客户端将协议解释为UTF-8编码文本,那么所有现有的输出仍然可以正常工作,因为UTF-8是ASCII的正确超集。

为什么不希望字段“始终解释为UTF-8”?你没说


如果您确实让客户端将协议解释为UTF-8编码的文本,那么所有现有的输出仍然可以正常工作,因为UTF-8是ASCII的正确超集。

这是一个非常糟糕的主意。要么所有涉及此的代码都是8位干净的,要么不是。如果不是,那么把U放进去也没用。如果是,那么你仍然是在字符串中间拾取字节。如果一些其他程序在中间分裂它呢?“U”将是一个在字符串中预期UTF-8的指示器。我同意,如果有什么东西会踩到最上面的部分,就会有问题——正如我在最后一段中所说的那样。为什么他不能区别对待U前缀字符串和非U前缀字符串?我不是建议他在字符串内进行切换,而是建议他要么将字符串的全部数据视为UTF-8,要么将其全部视为ASCII。找到字符串的结尾应该不会有问题。是的,我可以完全控制字符串的两端。尽管如此,在另一端还有另一个开发人员,他用foxpro编写了自己的软件。我将编写一个新的客户端作为ActiveX控件,他将“最终”使用该控件,但我们将重新分发给其他供应商。我想我只是想节省时间。我还喜欢通过telnet向服务器发送消息的能力——使用完全unicode将打破这一点。在我看来,整个消息就像一个字符串。如果OP真的能保证完全控制解释,好吗。@Matthew:如果你使用telnet的测试消息只需要ASCII码,那么你可以在没有任何问题的情况下使用UTF-8,这两者之间没有任何区别