0

我正在努力解决以下问题。我正在使用 VS10 并使用 .NET 框架 2.0。用 C# 编码。

我正在制作一个简单的编辑器,将其文本交给webservice。我知道 .NET 使用 UTF-16(我相信默认是 LE?我想要 Big Endian)。我想让它能够在任何编辑器中工作,因此附加一个 BOM。问题是通过html它会改变我相信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 而不是现在的不带 BOM 的 UTF-8。

我已经浏览了大量示例,但看不到我在这里做错了什么。有人可以提供建议或更正代码吗?(是的,我还阅读了 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);

我找不到任何可以切换到大端序的东西,但是我已经看到了一些切换到 UTF-8 的示例(我无法正常工作)。非常感谢任何帮助、示例或链接以获取 UTF-16BE 的代码。

4

3 回答 3

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);
于 2012-10-03T15:56:54.250 回答
0

要使用任何一种 UTF-X 编码的 BOM 文件,只需使用正确的编码创建 TextWriter:

using(var writer = 
    new StreamWriter(fileName, new Encoding.UnicodeEncoding(true,true,true))
{
   writer.Write(editorTextString);
}

使用提供 BOM 的UnicodeEncoding构造函数。

旁注:您的问题很可能与使用这种罕见的编码无关,但它应该解决您的代码现在尝试执行的操作。

于 2012-10-03T16:29:32.307 回答
0

我设法使用以下代码:

字节[] BOMTextBytesToSend = {0xfe, 0xff };

byte[] editorTextBytesToSend = System.Text.Encoding.BigEndianUnicode.GetBytes(editorTextString);

BOMTextBytesToSend.CopyTo(editorTextBytesToSend, 0);

于 2012-10-30T15:10:26.287 回答