Louise120 2024-03-26 15:11 采纳率: 0%
浏览 1

Unicode 字符 s 与自身和“s”匹配。

我只是试图清理包含字符 'ſ' (U+017F) 的旧德语文本。我想用 's' 替换它,但是当我使用 :%s/ſ/s/g 时,不仅该字符被替换,而且所有出现的 's' 后跟任意字符都被替换,就好像我使用了命令 :%s/s./s/g 一样。
例如,文本:
Die Gleichheit **) fordert das Nachdenken heraus durch Fragen, die ſich daran knüpfen und nicht ganz leicht zu beantworten ſind.
将被我的命令替换为:
Die Gleichheit **) fordert dasNachdenken herausdurch Fragen, die sich daran knüpfen und nicht ganz leicht zu beantworten sind.
我认为这可能与 'ſ' UTF-8 表示为两个字节序列 ( 0xC5 0xBF ) 的事实有关。这不是一个错误吗?如果没有,有没有办法只是替换而不是也? 'ſ' 's'
我正在使用 fileencoding=utf-8 和:

vim --version
VIM - Vi IMproved 9.1 (2024 Jan 02)
Included patches: 1-151
echo $LANG
de_DE.UTF-8
这是一张截 :set hlsearch 图:

img


更新:我在 Windows 10 上安装了高达 586 的 vim 8.0 版补丁,对我的命令和 %u 命令版本都表现出相同的行为。

  • 写回答

1条回答 默认 最新

  • 关注

    Louise120 下午好🌅🌅🌅
    本答案参考ChatGPT-3.5

    问题描述: 我想要清理包含字符 'ſ' (U+017F)的旧德语文本,并将其用 's' 替换。但是当我使用 :%s/ſ/s/g 命令时,不仅该字符被替换,还有所有出现的 's' 后跟任意字符都被替换,就好像我使用了命令 :%s/s./s/g 一样。

    可能原因: 这可能是因为 'ſ' 用 UTF-8 表示为两个字节序列(0xC5 0xBF)的原因。

    解决方案:

    1. 使用 \V 模式匹配替换命令,这将禁用正则表达式的特殊意义。可以使用 :%s/\Vſ/s/g 命令替换匹配的字符。
    2. 使用 = 模式匹配替换命令,这将在替换时执行表达式。可以使用 :%s/ſ/=substitute(submatch(0), 'ſ', 's', 'g')/g 命令替换匹配的字符。
    3. 如果你仍然遇到问题,可以尝试使用其他的编辑器或文本处理工具,如Python脚本,来进行字符替换操作。

    示例代码:

    1. 使用 \V 模式匹配替换命令: :%s/\Vſ/s/g

    2. 使用 = 模式匹配替换命令: :%s/ſ/=substitute(submatch(0), 'ſ', 's', 'g')/g

    评论

报告相同问题?

问题事件

  • 创建了问题 3月26日

悬赏问题

  • ¥15 做一个简单项目,用Python分析共享单车的数据
  • ¥20 在使用CESM2.2.0模型进行case.submit过程中出现如下错误(关键词-Map)
  • ¥15 有办法改变通过wifi进入的网站的设置吗
  • ¥15 所以到底怎么算!算到凌晨五点都算不出来!
  • ¥15 label_studio
  • ¥15 请教如何phython发邮件
  • ¥15 linux系统安装问题
  • ¥15 路径规划如何采用矢量法让他们尽量在一个方向
  • ¥15 crypto 一道rsa解密题
  • ¥15 survIDINRI已将生存时间转为数值变量,仍错误 Time variable is not numeric。