首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >从UTF8到ISO8859-1的转换不起作用

从UTF8到ISO8859-1的转换不起作用
EN

Stack Overflow用户
提问于 2019-05-12 23:48:10
回答 2查看 834关注 0票数 0

我想将字符串变量从UTF8转换为ISO8859-1,因为对于ä、ö、ü这样的特殊字符,我在C#中看到了?。为了实现这个目标,我找到了这个post。但它对我不起作用。我试着找出原因……

我用下面的代码观察了C#中原始字符串和转换后字符串的字节数:

代码语言:javascript
复制
 System.IO.MemoryStream stream = new System.IO.MemoryStream();
 System.Runtime.Serialization.IFormatter formatter = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
 formatter.Serialize(stream, dt2.Rows[0][0]); // I read my string from a datatable and it is utf8 encoded
  byte[] bytes = stream.GetBuffer(); 

下面这行代码:

代码语言:javascript
复制
Console.WriteLine(BitConverter.ToString(bytes).Replace("-", ""));

返回:

代码语言:javascript
复制
4652495343484BEFBFBD53455A55424552454954554E47454E2020

现在,我想编码为ISO-8859-1。为此,我使用以下代码:

代码语言:javascript
复制
var srcEncoding = Encoding.Default;   // The original bytes are utf8 hence here "Default"
var destEncoding = Encoding.GetEncoding("ISO-8859-1");
var destBytes = Encoding.Convert(srcEncoding, destEncoding, bytes);

然后运行这行代码:

代码语言:javascript
复制
Console.WriteLine(BitConverter.ToString(destBytes).Replace("-", ""));

我得到了相同的十六进制代码。转换似乎不能正常工作

代码语言:javascript
复制
4652495343484BEFBFBD53455A55424552454954554E47454E2020

你知道为什么转换对我不起作用吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-13 00:08:31

您的字符串不包含-umlaut。

它包含"Unicode replacement character"

在你获得byte[] bytes之前,无论发生了什么转换,你都已经失去了你的a-umlaut。

票数 2
EN

Stack Overflow用户

发布于 2019-05-13 01:35:52

没有理由搞乱MemoryStream%s和BinaryFormatter%s。只需使用相应Encoding的方法GetStringGetBytes

代码语言:javascript
复制
byte[] oldBytes = new byte[] { 0x46, 0x52, 0x49, 0x53, 0x43, 0x48,
    0x4B, 0xEF, 0xBF, 0xBD, 0x53, 0x45, 0x5A, 0x55, 0x42, 0x45, 0x52,
    0x45, 0x49, 0x54, 0x55, 0x4E, 0x47, 0x45, 0x4E, 0x20, 0x20 };
Console.WriteLine($"oldBytes: {BitConverter.ToString(oldBytes)} ({oldBytes.Length})");

string oldStr = Encoding.UTF8.GetString(oldBytes);
Console.WriteLine($"oldStr: <{oldStr}>");

byte[] newBytes = Encoding.GetEncoding("ISO-8859-1").GetBytes(oldStr);
Console.WriteLine($"newBytes: {BitConverter.ToString(newBytes)} ({newBytes.Length})");

string newStr = Encoding.GetEncoding("ISO-8859-1").GetString(newBytes);
Console.WriteLine($"newStr: <{newStr}>");

输出:

代码语言:javascript
复制
oldBytes: 46-52-49-53-43-48-4B-EF-BF-BD-53-45-5A-55-42-45-52-45-49-54-55-4E-47-45-4E-20-20 (27)
oldStr: <FRISCHK�SEZUBEREITUNGEN  >  
newBytes: 46-52-49-53-43-48-4B-3F-53-45-5A-55-42-45-52-45-49-54-55-4E-47-45-4E-20-20 (25)
newStr: <FRISCHK?SEZUBEREITUNGEN  >  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56100905

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档