我正在努力解决以下问题。 我正在使用V.S.10并使用.NET framework 2.0。用C#编码。
我正在编写一个简单的编辑器,将其文本移交给 webservice 。我知道.NET使用UTF-16(我相信默认是LE?我想要Big Endian)。我想让它能够在任何编辑器中工作,因此可以附加BOM。问题是通过httml它会改变我相信UTF-8?或者至少从以下错误中可以看出:
Client found response content type of 'text/html;
charset=UTF-8', but expected 'text/xml'.
The request failed with an empty response.
编辑:文档警告所有属性的编码都是UTF-8,没有BOM标记。 editorTextString是其中一个属性。但要上传的文件内容必须是带有BOM的UTF-16BE。我已经检查过.net是否会自动转换编码而不是。或者至少中文字母成了?所以我需要重新编码或转换更好的说,文本为UTF-16BE WITH BOM而不是UTF-8,而不是现在的BOM。
我看了很多例子,看不出我在这里做错了什么。有人可以提供建议或更正代码吗? (是的,我也读过Jon关于unicode的非常酷的文章:))理论很清楚,实际的做法是缺乏的。
// Convert to UTF-16 Big Endian
Encoding leUnicode = Encoding.Unicode;
Encoding beUnicode = Encoding.BigEndianUnicode;
byte[] editorTextBytesLE = leUnicode.GetBytes(editorTextString);
Console.WriteLine("Little Endian - Encoded bytes:");
foreach (Byte b in editorTextBytesLE)
{
Console.Write("[{0}]", b);
}
Console.WriteLine();
byte[] editorTextBytesBE = Encoding.Convert(leUnicode, beUnicode, editorTextBytesLE);
Console.WriteLine("BIG ENDIAN - Encoded bytes:");
foreach (Byte b in editorTextBytesBE)
{
Console.Write("[{0}]", b);
}
Console.WriteLine();
String decodedString = UnicodeEncoding.BigEndianUnicode.GetString(editorTextBytesBE);
Console.WriteLine();
Console.WriteLine("Decoded bytes:");
Console.WriteLine(decodedString);
// inserting UTF-16BE BOM marker, which eases recognition for any editor
byte[] editorTextBytesToSend = { 0xfe, 0xff };
editorTextBytesToSend.CopyTo(editorTextBytesBE, 2);
File.WriteAllText(fileName, decodedString);
Console.WriteLine("Uploading {0} to {1} ...", fileName, myURL);
// Upload the file to the URL
editorTextBytesBE = myWebClient.UploadFile(myURL, "PUT", fileName);
我无法找到任何可以切换到big endian的东西,但我已经看到一些例子(我无法工作唉)切换到UTF-8。非常感谢任何帮助,示例或链接,以获得UTF-16BE的代码。
答案 0 :(得分:1)
部分答案:
以下代码看起来不像插入任何内容。相反,它会使用您的BOM覆盖位置2和3的2个字节。它跳过了第一个2.
// inserting UTF-16BE BOM marker, which eases recognition for any editor
byte[] editorTextBytesToSend = { 0xfe, 0xff };
editorTextBytesToSend.CopyTo(editorTextBytesBE, 2);
答案 1 :(得分:0)
要使用带有两种UTF-X编码的BOM的文件,只需使用正确的编码创建TextWriter:
using(var writer =
new StreamWriter(fileName, new Encoding.UnicodeEncoding(true,true,true))
{
writer.Write(editorTextString);
}
使用提供BOM的UnicodeEncoding构造函数。
附注:您的问题很可能与使用这种罕见的编码无关,但它应该修复您的代码现在尝试执行的操作。
答案 2 :(得分:0)
我设法使用以下代码:
byte [] BOMTextBytesToSend = {0xfe,0xff};
byte [] editorTextBytesToSend = System.Text.Encoding.BigEndianUnicode.GetBytes(editorTextString);
BOMTextBytesToSend.CopyTo(editorTextBytesToSend,0);