如何按字符拆分中文字符串?

3

我有一个包含大部分中文字符的字符串,例如:

string sentence = "我想找到从夏洛特飞往拉斯维加斯,让站在圣路易斯";

我该如何按字符拆分句子?最终,我希望能够将我的字符串写入文件,并且每个字符都独占一行,例如:
我
想
找
到
从
夏
洛
特
飞
往
拉
斯
维
加
斯
,
让
站
在
圣
路
易
斯

我尝试着做了这个:

StringBuilder s = new StringBuilder();
foreach (char character in sentence.ToCharArray())
{
    s.Append(character + '\n');
}
string output = s.ToString();

StreamWriter writer = new StreamWriter("test.txt", false, Encoding.UTF8);
writer.Write(output);
writer.Close();

但是不知道为什么,它写的不是中文字符,而是

   29252242105020184228092794129315391442445825299260413251021162260416530235763314592232222317363452614126041

...而不是将其打印到控制台上。然而,这样做

StreamWriter writer = new StreamWriter("text.txt", false, Encoding.UTF8);
writer.Write(sentence);
writer.Close();

...成功地将中文句子写入文件,因此我知道写入文件的方式不应该是问题所在。


+1。这是一个有趣的问题,因为人们往往会认为它是一个编码问题,但实际上它要简单得多(根据答案)。 - Joel Rondeau
2个回答

6
我认为问题可能是(character + '\n')被解释为整数。也许尝试在该行添加一个强制转换,或者将其拆分为两个附加操作,如下所示:
s.Append(character);
s.Append('\n');

1
是的,这就是问题所在。在char上使用+运算符不能进行字符串连接。相反,它会将char隐式转换为int并相加。例如,'A' + 'B' == 65 + 66 == 131 - dan04
谢谢,问题解决了!(虽然 StackOverflow 让我等待另外 9 分钟才能选择答案...) - Michael0x2a
可以使用 character + "\n" 或者 character + Environment.NewLine 代替。 - Joel Rondeau

1
        var sentence = "我想找到从夏洛特飞往拉斯维加斯,让站在圣路易斯";
        var chars = sentence.ToCharArray();

        using (var writer = new StreamWriter("test.txt", false, Encoding.UTF8))
        {
            foreach (var c in chars)
            {
                writer.WriteLine(c);
            }

            writer.Close();
        }

对我来说运行良好


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