在C#中如何更改编码方式?

3

理论问题:

假设有一个只知道如何传输ASCII字符(0..127)的源。

现在有一个接收这些字符的终端。

那么这个终端能否将这些字符解码为UTF8格式?

    ascii chars
        ...
        ...
         |
         |
         V

    read as utf ?

类似这样的伪代码:

    var txt="אבג";
    var _bytes=Encoding.ASCII.GetBytes(txt);   <= it wont recognize [א] here
    ...transmit...
    var myUtfString=Encoding.UTF8.GetString(getBytesFromWire();  <= some magic has to be done here
2个回答

3
那是可能的,但不能使用UTF8。
UTF8通过将多字节字符编码为介于128和255之间的字节序列来工作。
您的ASCII协议将无法传输这些字节。
相反,您需要一些机制来在纯ASCII文本中存储任意Unicode代码点或字节:
  • 您可以使用任何编码对Unicode文本进行编码,以获得(非ASCII)字节流,然后使用Base64编码传输这些字节。
  • 您可以使用UTF7编码使用纯ASCII字符对Unicode代码点进行编码。
    如果您的文本大部分是ASCII,则这将比Base64更节省空间。

@RoyiNamir:UTF7和UTF8一样是Unicode编码。但与UTF8不同的是,它仅使用纯ASCII字符(或字节)。您可以简单地使用Encoding.UTF7类。 - SLaks
这就是我想问的(你的编辑):在网络上传输时,谁更冗长?base64还是utf7...... - Royi Namir
@RoyiNamir:这取决于字符的分布情况。 - SLaks
UTF-7 使用 base64 编码。 - Hans Passant
我不明白 Encoding.UTF7.GetBytes("1")49,而 Encoding.UTF7.GetBytes("1א")49 43 66 100 65 45。这与每个字符长度固定(4)的 base64 不同。那么解码器如何知道如何解析它?它可以决定使用 49 4366 100 65 45 或其他变化...你能解释一下吗? - Royi Namir
@RoyiNamir:请查看维基百科文章,其中解释了编码的工作原理。http://en.wikipedia.org/wiki/UTF-7 Base64部分被+...-包围。 - SLaks

1
var txt = "אבג";
var str = Convert.ToBase64String(Encoding.UTF8.GetBytes(txt)); //<--ASCII
//Transmit
var txt2 = Encoding.UTF8.GetString(Convert.FromBase64String(str));

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