如何将 Unicode 字符输出为一对 ASCII 字符?
Posted
技术标签:
【中文标题】如何将 Unicode 字符输出为一对 ASCII 字符?【英文标题】:How do I output Unicode characters as a pair of ASCII characters? 【发布时间】:2011-02-07 15:52:37 【问题描述】:如何转换(例如):
Señor Coconut Y Su Conjunto - Introducciõn
到:
Señor Coconut Y Su Conjunto - Introducciõn
我有一个创建 m3u 播放列表的应用程序,但是当曲目文件名、艺术家或标题包含非 ASCII 字符时,音乐播放器无法正确读取它,因此无法播放曲目。
我发现如果我将曲目写成:
#EXTINFUTF8:76,Señor Coconut Y Su Conjunto - Introducciõn
#EXTINF:76,Señor Coconut Y Su Conjunto - Introducciõn
#UTF8:01-Introducciõn.mp3
01-Introducciõn.mp3
然后音乐播放器会正确读取并播放曲目。
我的问题是我找不到正确进行转换所需的信息。
我尝试了以下方法:
byte[] byteArray = Encoding.UTF8.GetBytes(output);
foreach (Byte b in byteArray)
playList.Write(b);
在哪里playList = new StreamWriter(filename, false);
,但我只是得到一系列数字输出:
#EXTINFUTF8:76,83101195177111114326711199111110117116328932831173267111110106117110116111 - 731101161141111001179999105195181110
我猜是字符的数值而不是字符本身。
我已经有一段时间没有做这种低级的角色操作了,我有点生疏了。
更新
我现在有:
byte[] byteArray = Encoding.UTF8.GetBytes(output);
foreach (Byte b in byteArray)
playList.Write(Convert.ToChar(b));
进行输出,乍一看它似乎正在工作。 Notepad++ 中显示的文件显示了正确的信息。但是,第一首曲目仍未播放。
【问题讨论】:
playList.Write("0", b);这会将字节转换为数字。 @Andrey - 我意识到 ;) 我不知道用什么来代替它。 查看我的 cmets 以获得我的答案 离题评论:文件名中的单词应该是“introducción”,而不是“introducciõn”。 :-) 您是否尝试将字节转换为字符?播放列表.Write((char)b); (或寻找 WriteByte 方法)。如果演员表不起作用,我不确定您是否可以获得新的 char(b) 。如果 Write 不接受字符,您可能必须形成一个单字符字符串: new string(c, 1); (或者没有 ,1 也可以工作)。 【参考方案1】:好吧,尝试编写播放器期望的编码。它是utf8! (我猜)
byte[] bytesToWrite = Encoding.Utf8.GetBytes(yourString);
在您的示例中看到:#UTF8
?
【讨论】:
我应该补充说我已经尝试过了,但只是得到了一系列数字。 然后你输出字节到文件不正确。我打赌(10 美元 :))它是 utf8。正确输出即可 使用 StreamWriter 并将 Encoding.Utf8 传递给 ctor。它会成功的 用这个 ctor msdn.microsoft.com/library/f5f5x7kt.aspx 创建 StreamWriter,然后调用 WriteLine(output) 或 Write(output)。在这种情况下,您不需要调用 GetBytes 你如何检查?使用记事本?使用十六进制编辑器或智能记事本++ 打开文件。 Señor 与 Señor 相同,或者取决于您打开它的编码。【参考方案2】:您希望整个流采用 UTF-8。试试:
StreamWriter playList = new StreamWriter(filename, false, System.Text.Encoding.UTF8);
现在,要写入流,只需像这样传递您名为 output
的 String
:
playList.Write(output);
流现在都将采用正确的编码,因此您还应该能够执行以下操作:
playList.WriteLine("#EXTINFUTF8:76,Señor Coconut Y Su Conjunto - Introducciõn");
【讨论】:
是的 - 做到了。我昨晚在睡觉时自己意识到了这一点,当我看到你的回答时,我正要尝试。以上是关于如何将 Unicode 字符输出为一对 ASCII 字符?的主要内容,如果未能解决你的问题,请参考以下文章
如何将扩展 ascii 转换为 System.String?