如何将 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);

现在,要写入流,只需像这样传递您名为 outputString

playList.Write(output);

流现在都将采用正确的编码,因此您还应该能够执行以下操作:

playList.WriteLine("#EXTINFUTF8:76,Señor Coconut Y Su Conjunto - Introducciõn");

【讨论】:

是的 - 做到了。我昨晚在睡觉时自己意识到了这一点,当我看到你的回答时,我正要尝试。

以上是关于如何将 Unicode 字符输出为一对 ASCII 字符?的主要内容,如果未能解决你的问题,请参考以下文章

Scrapy输出文件格式问题汇总

关于unicode和ascii的区别

如何将扩展 ascii 转换为 System.String?

Python3 - 将非 ascii 字符替换为其 unicode 代表值? [复制]

如何将单片机中字符串转unicode码

Oracle中chr()函数