将UTF-8转换为UTF-16BE

时间:2012-10-03 15:50:00

标签: c# .net encoding

我正在努力解决以下问题。 我正在使用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的代码。

3 个答案:

答案 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);