JavaFX Canvas逐字形绘制文本首字符异常,是代码还是编码问题?
问题排查结论
你遇到的异常需要从代码、编码两个方向定位,常见原因如下:
1. 代码逻辑问题
你贴的示例代码首先存在变量名不匹配的低级错误:
你声明存储码点的变量为codePoint,但调用Character.toString时传入的是未定义的cp,如果这不是你写示例时的笔误,就是实际运行代码的问题,会直接导致第一个字符取值错误,渲染异常。
如果是笔误,变量名实际统一,你还需要确认两个点:
- 逐字符调用
fillText绘制时,每次绘制后的x坐标偏移是否计算正确,首字符绘制位置偏移也会导致显示异常 - 所用字体是否支持首字符对应的Unicode码点,字体缺字会显示为方块、问号等异常样式
2. 文件编码问题
这是首字符显示异常最常见的原因:你采用UTF-16 LE编码加载文件,大概率没有处理BOM(字节顺序标记)。
带BOM的UTF-16 LE文件开头会固定存在2字节的标记0xFF 0xFE,对应Unicode码点U+FEFF(零宽无间断空格),这个标记不属于文本内容,仅用来标识字节序。如果加载文件时没有跳过这个码点,会把它当作文本首字符渲染,就会出现首字形异常的问题。
排查方法很简单:打印第一行文本的第一个码点的十进制值,如果输出为65279即可确认是BOM导致,加载文件时跳过首码点即可。
如果确认文件不带BOM,可以核对首字符的原始字节和解析出的码点是否对应,排除加载时字节序搞反成UTF-16 BE的问题。
内容的提问来源于stack exchange,提问作者DbSchema
相关产品推荐
相关产品推荐

