Vim运行shell命令,将汉字转换为符号'';

Vim运行shell命令,将汉字转换为符号'';,vim,encoding,Vim,Encoding,我尝试将set.*编码(例如,编码,文件编码,等等)运行到utf-8,但问题没有解决 问题是:当我在普通shell中运行命令时,一切都很顺利: $ make SQL +-----+-----------+------------------+-------+ | Sno | Sname | Cname | Grade | +-----+-----------+------------------+-------+ | 01 | Peter | C Lang

我尝试将
set.*编码
(例如,
编码
文件编码
,等等)运行到
utf-8
,但问题没有解决

问题是:当我在普通shell中运行命令时,一切都很顺利:

$ make SQL
+-----+-----------+------------------+-------+
| Sno | Sname     | Cname            | Grade |
+-----+-----------+------------------+-------+
| 01  | Peter     | C Language       |  98.1 |
| 01  | Peter     | Data Struct      |  89.3 |
...
| 08  | 王小明    | NULL             |  NULL |
| 09  | 王明儿    | NULL             |  NULL |
| 10  | A明B      | NULL             |  NULL |
| 11  | A明B      | NULL             |  NULL |
...
+-----+-----------+------------------+-------+
它工作得很好,但是当我使用vim命令在vim下运行它时
:r!使SQL
,它将以“?”符号打印:

+-----+-----------+------------------+-------+
| Sno | Sname     | Cname            | Grade |
+-----+-----------+------------------+-------+
| 01  | Peter     | C Language       |  98.1 |
| 01  | Peter     | Data Struct      |  89.3 |
...
| 08  | ???       | NULL             |  NULL |
| 09  | ???       | NULL             |  NULL |
| 10  | A?B       | NULL             |  NULL |
| 11  | A?B       | NULL             |  NULL |
...
+-----+-----------+------------------+-------+
我不确定会发生什么,但我有一个可行的解决方案:

  • 在shell中运行
    makesql>tmp
  • 运行
    :r!vim中的cat tmp
  • 我也知道
    :r!使SQL>tmp&&cat tmp
    仍然存在“?”问题。我确实想使用
    r!直接在vim中生成SQL,这就是我问这个问题的原因。谢谢你的帮助

    :r!区域设置的结果是:

    locale: Cannot set LC_CTYPE to default locale: No such file or directory
    locale: Cannot set LC_MESSAGES to default locale: No such file or directory
    locale: Cannot set LC_ALL to default locale: No such file or directory
    LANG=en
    LANGUAGE=
    LC_CTYPE="en"
    LC_NUMERIC="en"
    LC_TIME="en"
    LC_COLLATE="en"
    LC_MONETARY="en"
    LC_MESSAGES="en"
    LC_PAPER="en"
    LC_NAME="en"
    LC_ADDRESS="en"
    LC_TELEPHONE="en"
    LC_MEASUREMENT="en"
    LC_IDENTIFICATION="en"
    LC_ALL=
    

    en
    在许多系统上都不是有效的区域设置,即使在被接受的地方,也不会有您想要的结果。通常,区域设置的格式为
    xx_xx.CHARSET
    ,其中
    xx
    是语言代码,
    xx
    是国家代码,
    CHARSET
    是字符集。例如,您可以使用UTF-8为美式英语编写
    en_US.UTF-8
    ,或者使用UTF-8为瑞士法语编写
    fr_CH.UTF-8

    由于大多数Unix操作系统都先于UTF-8的存在(macOS可能是一个例外),因此系统上的默认区域设置通常不是UTF-8,因此如果指定的区域设置没有显式声明UTF-8,则工具将不会使用UTF-8

    因此,您需要按照上面的格式适当地设置您的区域设置,以便您的系统在任何地方都使用UTF-8。这将使程序正确运行

    特别是对于Vim,如果您从这样的管道命令读取数据,Vim将执行字符集检测(由
    文件编码控制)。如果没有设置
    编码
    并且您的区域设置是Unicode区域设置,Vim将查找字节顺序标记,然后是Unicode,然后默认为
    latin1
    。如果它不是Unicode语言环境,并且没有设置值,那么Vim将只是您当前的语言环境,这可能会被解释为
    latin1
    ,您会很难过。看起来这里发生了什么


    当然,您可以调整
    编码
    文件编码
    文件编码
    ,但在Vim和所有程序中获得正常行为的最简单方法是将您的语言环境设置为使用UTF-8的语言环境。

    执行
    :r!语言环境
    :帮助“编码”
    :帮助“文件编码”
    ,和
    :帮助“文件编码”
    仅影响Vim本身。如果您想在utf-8中工作,您必须确保为该功能配置了整个系统。