包含Unicode字符的字符串长度计算

3
我们一直在努力计算包含Unicode字符的字符串的长度,例如(Word字符,如’),这些字符被粘贴到我们系统的文本区域中,然后保存。当我们需要返回相同的保存字符串并且需要计算我们的响应内容长度时,正常的C#字符串长度不会正确计算,因为Unicode具有多个字符。
我们尝试使用System.Globalization.StringInfo类读取字符数,但仍无法正确计算请求的长度。例如,如果Json响应对象的最后一个闭合大括号由于长度太短而被浏览器截断。
如果有人能够分享任何有效的解决方法,我们将不胜感激。迄今为止,我们尝试过以下方法:
    Response.AddHeader("content-length", content.GetType() == typeof(string) ? 
new System.Globalization.StringInfo(content.ToString()).LengthInTextElements.
ToString() : ((byte[])content).Length.ToString());

1
不清楚你的问题。你有一个C#字符串、JSON字符串还是byte[]?你想知道字符数、字节数还是_打印位置_数量,即如果打印出来的行长? - DrKoch
内容长度以字节为单位。那么单凭内容就能确定内容长度吗?这不会因编码方式而异吗?如果使用UTF-8发送,则长度将与UTF-16不同。它也可以被gzip压缩。这个标头实际上是为了让Web服务器确定的。或者我可能混淆了内容长度和传输长度。(https://www.ietf.org/rfc/rfc2616.txt) - Moby Disk
我也相信content-length应该是字节计数! - CSharpie
抱歉造成不明确。我们要更改的方法有点像是请求和响应处理程序,这是我们的应用程序正在使用的中央HTTP请求处理程序。根据所请求的URL,它会从应用程序列表中调用相应的应用程序方法,然后发送回其响应。 我发送回的响应实际上是由Newtonsoft.Json库序列化为json字符串的Dictionary <string,object>,当其中包含Unicode字符时,计算该json字符串的长度就成了问题。希望现在更清楚了。 - Hano Johannes Rossouw
1个回答

2
给定一段任意的字节块,你知道它代表一些文本,并且使用UTF8编码,唯一确定实际字符数的方法是解码这段文本。例如通过将其传递给Encoding.UTF8.GetString()。然后你只需要查看返回的string的长度。
话虽如此,HTTP响应的Content-Length字段应该表示响应的字节数。如果你必须自己设置长度,你应该使用总字节数。但如果你使用例如HttpResponse,我期望这个字段会自动设置。

我同意你的观点,即HTTP响应正确计算响应长度。如果我删除内容长度标头,则浏览器可以正确构造JSON对象,因为HTTP响应会为您完成此操作。但由于某种原因,我们的架构师将内容长度标头添加到WriteResponse类中。我将继续测试以查看所有其他数据排列组合是否正确计算了内容长度,如果是,我将标记您的答案为正确,并更正我们的架构师。 - Hano Johannes Rossouw

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接