为什么在 Intellij IDEA 中代码中存在 ENQ/ESA unicode 字符会导致它显示错误的多字符文字错误?

YaM*_*MiN 5 unicode intellij-idea lexer intellij-plugin kotlin

当我遇到这个问题时,我试图解决一些奇怪的 PDF Unicode 重新映射问题,即向代码的某些部分添加ENQ Unicode字符会阻止您编译代码,并且 IDE 会向您显示我认为是误报的信息(错误)。

考虑这个完全有效的 Kotlin 代码示例,我们将其称为程序 A,不幸的是,您看不到撇号之间的实际字符,但相信我,其中有一个字符(如果您将此代码复制到 IDE 中,您可以看到这些字符) 。

package yamin

fun main() {
    val foo = mutableListOf('')
    //val bar = mutableListOf('')
    println(foo)
}
Run Code Online (Sandbox Code Playgroud)

但是,您可以在图片中看到它们。

方案A

但是,如果您决定编译此代码,IDE 将无法编译它,并声称第 4 行中存在“字符文字中的字符过多” 。

程序错误错误

有趣的是,即使在注释行中,ENQ 字符的绝对存在也会阻止 IDE 编译此代码,如果您删除第 5 行,因此,删除ENQ 字符的存在,然后您可以编译此代码(我们称之为程序 B)), 观察:

方案B

无论如何,如果您决定删除程序 A中的第 4 行取消注释第 5 行,那么您也可以编译该代码(我们将其称为程序 C)。

在此输入图像描述

因此,让我们回顾一下程序 A 无效,第 4 行是无效的罪魁祸首,但是删除该程序中的第 5 行,这样我们就可以成功编译程序 B,并且程序 C 会重复这种情况。

我在这里缺少什么?

Мих*_*аль 3

它看起来像是 Kotlin 编译器中的一个错误,因为即使使用命令行编译代码也会发生错误: kotlinc enq.kt -include-runtime -d enq.jar

此外,这个简单的程序在操场上给出了不同的结果(正确):

在此输入图像描述

和本地(不正确):

在此输入图像描述

作为解决方法,您可以使用 Unicode 转义序列语法(至少对于 ENQ 符号):

在此输入图像描述

当将此代码传递到服务器时,Playground 会执行相同的操作,因此编译器会获得经过清理的代码: 在此输入图像描述