【发布时间】:2015-09-09 08:35:32
【问题描述】:
我有一个只支持本机数据类型的 COM 服务器应用程序 (App_A)。我通过 COM 服务器将参数发送到 C# 应用程序 (App_B),然后将数据作为 Web 请求发送。
我的问题是 App_A 读取的 String 数据是 Unicode,但是 App_A 不支持其 COM String 值的非 UTF-8 编码,所以数据可以作为字节数组或字符数组发送。
如果我使用字节数组,则通用 App_B 现在已损坏,因为我现在必须以与其他所有数据不同的方式处理此单个数据更新(我担心会有更多),所以我想保留 App_B 处理通用值 (obj.ToString)。
如果我将 App_B C# 字符串硬编码为文字,例如“\u5f90”,字符串包含一个 Unicode 字符,并且 App_B 中的 HttpUtility.UrlEncode 调用完全按预期工作。如果字符串作为值传入 (obj.ToString() = "\u5f90"),则 '\' 被转义,并且 UrlEncode 不会对 Unicode 字符进行 UTF-8 编码,因为 '\u' 转义序列丢失.
我想我的问题归结为:
到目前为止,我已经在 App_A 中操作了字节数组,将 Unicode 值 (xxxx) 替换为 '\uxxxx': - 有什么方法可以在 C# App_B 中使用字符串变量作为格式字符串?
或者,如果我以错误的方式解决这个问题,有人会建议什么?
请记住,我有大约 300 个数据值更新,它们都使用通用 o.ToString 作为 UrlEncode 参数的一部分,如果可能,我想保留它。
【问题讨论】:
-
我是否正确理解您的 COM 服务器返回 UTF-8 字符串而不是 Unicode 字符串?这将是相当不寻常的,因为 COM“自然地”与 Unicode 一起工作......为什么不让 COM 服务器提供 Unicode 字符串而不是 UTF-8?
-
App_A(COM 发布者)仅支持 char 作为 8 位数据类型。这就是为什么将 Unicode 字符串作为“数据”类型 (byte[]) 或“字符串”类型 (char[]) 发送的原因。它正在剥离所有字符值 > 127 (ASCII)。
-
如果你不能让 COM 服务器发出 Unicode 字符串,我宁愿让它发出 UTF8 字符串/字节数组并在客户端(App_B)进行 UTF8 转换。您将 Unicode 转义序列插入字符串的想法不会为您节省客户端上的转换过程——它只是将一种转换方法(UTF-8 字节数组->字符串)与另一种(转义字符串->解码字符串)交换。相比之下,您的想法在我看来更糟:它需要在服务器和客户端中进行特定更改 - 而在客户端上进行适当的 UTF8 转换后,服务器可以保持原样
-
另一方面,既然您显然能够修改 COM 服务器的代码,那么什么会阻止您扩展它以使其能够发出 Unicode 字符串?我并不是说这是一个问题或讨论邀请。而是作为对重新考虑 COM 服务器的评论(当然,根据您的情况允许或多或少...)
-
App_A 是现成的,COM 服务器非常有限,但它使用硬件从网络读取 Unicode 字符串。我们所拥有的是能够改变通过 App_A 的 COM 服务器传递的值的内容,但不能改变它支持的数据类型。
标签: c# string formatting