java - Java 和 C 之间的代码点不匹配

标签 java c kotlin codepoint imgui

所以,我在使用以下字符时遇到了一些问题 在 imgui 的港口到 kotlin

在对字符集和编码进行了一整天的研究之后,我只剩下了唯一的希望:依靠 unicode 代码点。

jvm 上的那个字符

"–"[0].toInt() // same as codePointAt()

返回代码点 u2013

在 C 上,我不确定,但因为这是正在发生的事情 done :

const ImFontGlyph* ImFont::FindGlyph(ImWchar c) const
{
    if (c >= IndexLookup.Size)
        return FallbackGlyph;
    const ImWchar i = IndexLookup.Data[c];
    if (i == (ImWchar)-1)
        return FallbackGlyph;
    return &Glyphs.Data[i];
}

在哪里

typedef unsigned short ImWchar

ImVector<ImWchar> IndexLookup; // Sparse. Index glyphs by Unicode code-point.

所以,这样做

char* a = "–";
int b = a[0];

返回代码点 u0096

据我所知,它看起来超过了 127 ( 0x7F ) 我们处于“扩展 Ascii”领域,这很糟糕,因为它似乎有不同的版本/解释。

例如,这个encoding table与我的代码点不匹配,但是 Cp1252 encoding确实如此,所以我倾向于认为这就是 C 上实际使用的内容。

在刚才提到的链接底部的表格中,你实际上可以看到150 (十进制,从给定数字的右列开始计数)确实对应于 2013 (十六进制,我觉得它有点语无伦次,但无论如何)。

为了解决这个问题,我尝试转换我的 String s 在 Kotlin 上使用相同的编码(暂时忽略这当然是特定于平台的),因此对于每个 c: Char

"$c".toByteArray(Charset.forName("Cp1252"))[0].toUnsignedInt

这行得通,但会破坏外国字体的渲染,例如中文、日文等。

因此,我的问题是:为什么 u2013 之间存在差异?在 JVM 和 u0096 上在 C?

处理这个问题的正确方法是什么?

最佳答案

目前我解决了this在 Windows 上,我在检索 char 代码点之前插入了这个函数。 它基本上重新映射所有与 ISO-8859-1 不同的字符。你可以在这个 table 中看到它们, 它们都是带有浅灰色边框的。

internal fun Char.remapCodepointIfProblematic(): Int {
    val i = toInt()
    return when (Platform.get()) {
        /*  https://en.wikipedia.org/wiki/Windows-1252#Character_set
         *  manually remap the difference from  ISO-8859-1 */
        Platform.WINDOWS -> when (i) {
            // 8_128
            0x20AC -> 128 // €
            0x201A -> 130 // ‚
            0x0192 -> 131 // ƒ
            0x201E -> 132 // „
            0x2026 -> 133 // …
            0x2020 -> 134 // †
            0x2021 -> 135 // ‡
            0x02C6 -> 136 // ˆ
            0x2030 -> 137 // ‰
            0x0160 -> 138 // Š
            0x2039 -> 139 // ‹
            0x0152 -> 140 // Œ
            0x017D -> 142 // Ž
            // 9_144
            0x2018 -> 145 // ‘
            0x2019 -> 146 // ’
            0x201C -> 147 // “
            0x201D -> 148 // ”
            0x2022 -> 149 // •
            0x2013 -> 150 // –
            0x2014 -> 151 // —
            0x02DC -> 152 // ˜
            0x2122 -> 153 // ™
            0x0161 -> 154 // š
            0x203A -> 155 // ›
            0x0153 -> 156 // œ
            0x017E -> 158 // ž
            0x0178 -> 159 // Ÿ
            else -> i
        }
        else -> i // TODO
    }
}

关于java - Java 和 C 之间的代码点不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55500127/

相关文章:

Heroku/Jetty 上的 Java

C - 使用指针的自定义快速排序 + 比较器不起作用

c - 从动态数组 C 中删除元素

javascript - 无法从JavaScript访问Kotlin JS

kotlin - 有没有办法在Kotlin中关闭使用网站的协方差?

java - 使用单独的包进行程序输出

java - 如何在 Spring MVC 中检索 ErrorField 的错误消息

android - 将数据添加到TableLayout的新列中的现有行-Kotlin

'2010-10-11T22:10:10.000Z' 的 Java 日期格式

C中3维数组转换为2维数组