在 unicode 文件的每个字符后添加 space 时出现区域设置错误?

Locale error when adding a space after each character for a unicode file?

我想为文本文件中的每个字符添加空格

in.txt

在吗??
嗯
你让我看的那款手提是不是11寸的,很小的?
看来还是美国的便宜啊
应该是吧

out.txt

在 吗 ? ?
嗯
你 让 我 看 的 那 款 手 提 是 不 是 1 1 寸 的 , 很 小 的 ?
看 来 还 是 美 国 的 便 宜 啊
应 该 是 吧

我试过这个 (How to remove/add spaces in all textfiles?) 但它输出:

� � � � � � � � � � � � 
� � � 
� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 1 1 � � � � � � � � � � � � � � � � � � � � 
� � � � � � � � � � � � � � � � � � � � � � � � � � � � � 
� � � � � � � � � � � � 

如何实现out.txt


我也试过:

$ perl -F'' -C -lane 'print join " ", @F' in.txt 
perl: warning: Setting locale failed.
perl: warning: Please check that your locale settings:
    LANGUAGE = (unset),
    LC_ALL = (unset),
    LC_PAPER = "de_DE.UTF-8",
    LC_ADDRESS = "de_DE.UTF-8",
    LC_MONETARY = "de_DE.UTF-8",
    LC_NUMERIC = "de_DE.UTF-8",
    LC_TELEPHONE = "de_DE.UTF-8",
    LC_IDENTIFICATION = "de_DE.UTF-8",
    LC_MEASUREMENT = "de_DE.UTF-8",
    LC_TIME = "de_DE.UTF-8",
    LC_NAME = "de_DE.UTF-8",
    LANG = "en_US.UTF-8"
    are supported and installed on your system.
perl: warning: Falling back to the standard locale ("C").
� � � � � � � � � � � �
� � �
� � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � � 1 1 � � � � � � � � � � � � � � � � � � � �
� � � � � � � � � � � � � � � � � � � � � � � � � � � � �
� � � � � � � � � � � �

$ cat in.txt 在吗??
嗯
你让我看的那款手提是不是11寸的,很小的?
看来还是美国的便宜啊
应该是吧
$ sed 's/\s/g;s/./& /g'  in.txt
sed: -e expression #1, char 10: unknown option to `s'

我的语言环境似乎有问题:

$ locale
locale: Cannot set LC_ALL to default locale: No such file or directory
LANG=en_US.UTF-8
LANGUAGE=
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC=de_DE.UTF-8
LC_TIME=de_DE.UTF-8
LC_COLLATE="en_US.UTF-8"
LC_MONETARY=de_DE.UTF-8
LC_MESSAGES="en_US.UTF-8"
LC_PAPER=de_DE.UTF-8
LC_NAME=de_DE.UTF-8
LC_ADDRESS=de_DE.UTF-8
LC_TELEPHONE=de_DE.UTF-8
LC_MEASUREMENT=de_DE.UTF-8
LC_IDENTIFICATION=de_DE.UTF-8
LC_ALL=

要修复它,我必须这样做:

export LC_ALL=en_US.UTF-8
export LANG=en_US.UTF-8
export LANGUAGE=en_US.UTF-8

然后:

$ perl -F'' -C -lane 'print join " ", @F' in.txt 
在 吗 ? ?
嗯
你 让 我 看 的 那 款 手 提 是 不 是 1 1 寸 的 , 很 小 的 ?
看 来 还 是 美

假设您正确设置了 UTF-8 语言环境,您可以使用这个 Perl 单行代码:

perl -F'' -C -lane 'print join " ", @F' in.txt > out.txt

-a 开关在字段分隔符上拆分输入,该分隔符已设置为空字符串,因此每个字符都是数组 @F 中的一个单独元素。由于这里使用了join,因此在该行的最后一个字符之后没有添加space(不清楚是否应该有)。

另一种选择是使用替换:

perl -C -pe 's/(.)/ /g' in.txt > out.txt

这将在每个字符后添加一个 space,包括最后一个字符。

检查UTF-8是否设置正确,

env | grep -i utf
LANG=en_US.UTF-8

您可以参考以下link了解更多关于语言设置的信息。

http://perlgeek.de/en/article/set-up-a-clean-utf8-environment

下面的单行效果很好。

 sed 's/\s/g;s/./& /g'  in.txt

这是示例输出:

sed 's/\s//g;s/./& /g'  in.txt 
在 吗 ? ? 
嗯 
你 让 我 看 的 那 款 手 提 是 不 是 1 1 寸 的 , 很 小 的 ? 
看 来 还 是 美 国 的 便 宜 啊 
应 该 是 吧