我有一个C#应用程序可以调用冷融合Web服务(它类似于Web服务)。此服务返回1252编码的XML格式,通过特定范围的字符编码如下:˜
。这是实际回归的角色之一。我知道代码页1252中的实际文本值是“〜”,因为我可以在数据库中看到原始格式的值。
我从服务中获取原始XML并将其提供给XmlTextReader,如下所示:
// turn our raw xml into a reader
byte[] responseBytes = UTF8Encoding.UTF8.GetBytes(rawXml);
MemoryStream responseStream = new MemoryStream(responseBytes);
state.XmlResponseReader = XmlTextReader.Create(
responseStream,
new XmlReaderSettings { IgnoreWhitespace = true });
再往下我打电话给state.XmlResponseReader.Read()
。当我这样做时,这些十六进制编码的值将完全从文本中删除。因此,以下文字:"˜hi there"
将显示为“hi there”。我想“〜喜欢那里”。
我尝试了很多不同的东西来尝试将这些值解码为等效的文本,但没有任何效果。
手动我可以通过取十六进制值(98),将其转换为十进制(152)来获得正确的值。然后这样做:Encoding.GetEncoding(1252).GetString(new byte[] {152})
。然而,完全手动的是不太可取的。有没有人知道我可以在.Net框架中使用更简化的功能来转换?
答案 0 :(得分:0)
你可以在值上使用Server.Decode吗?见:http://msdn.microsoft.com/en-us/library/hwzhtkke.aspx
答案 1 :(得分:0)
最后我没有找到让XmlTextReader对数据进行自动编码的方法,但我找到了下一个最好的东西。使用ReadChars(在XmlReader上不可用)我能够从XML节点的InnerText中检索数据,而不会损坏这些字符,从而导致数据丢失。
这是我的代码:
int readCharacters = 0;
short bufferSize = 40;
char[] buffer = new char[bufferSize];
StringBuilder innerString = new StringBuilder();
do
{
readCharacters = reader.ReadChars(buffer, 0, bufferSize);
innerString.Append(buffer, 0, readCharacters);
} while (readCharacters != 0);
这允许我取回原始数据示例(—˜
),此时我可以手动从该字符串中取出97和98,将它们转换为小数,然后转换为ascii字符。所以解决方案仍然是至少1/2手动,但ReadChars已经为我节省了一些前端的全字符串操作,否则这些操作是为了方便手动步骤所必需的。