【问题标题】:Formatting a String using a String variable as the Format string使用字符串变量作为格式化字符串格式化字符串
【发布时间】: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


【解决方案1】:

您是否可以选择在反序列化 App_B 中的字节数组时支持不同的编码?我建议修改 App_A,以便每个发送的字符串都有一个额外的第一个字节,它定义了编码,然后必须由 App_B 遵守。这样,您使用哪种编码并不重要,只要两个应用都支持即可。

我强烈建议不要修改你所描述的字符串,在它前面加上\u,那只会是后面的代码混乱,需要很好地记录下来,如果你来了,需要再次理解稍后再回来等等。

【讨论】:

  • 嗨,我明白,但这是目前唯一需要特殊处理的值,我们更容易更改一个 COM 参数的值,而不是实现您建议的大约。 300 个其他参数。
  • 我们只通过 COM 服务器传递 int 或 string 类型,所有这些类型都通过它们的 .ToString() 返回值进行 UrlEncoded。如果我用'\u'传递文字字符串,那也可以,并且考虑到App_A COM服务器的约束,这是最简单的(我认为)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-22
  • 1970-01-01
相关资源
最近更新 更多