Che*_*eng 5 java sqlite android string-length
给出相同的 String 数据
length对其TEXT列执行计算。TEXT列被读入(Using Android Room database)Java String,然后Java执行String.length()这些有没有可能产生 2 个不同的值?
我使用英文和非英文字符做了一个粗略的测试。两者产生相同的值。
但是,我不确定我是否遗漏了任何边缘情况?
由于您正在寻找边缘情况...
来自 SQLite 的内置标量 SQL 函数:
length(X)
对于字符串值 X,
length(X) 函数返回 X
中第一个 NUL 字符之前的字符数(不是字节数)。(强调我的)
由于 SQLite 字符串通常不包含 NUL 字符,
因此 length(X) 函数通常会返回字符串 X 中的字符总数....
所以,SQLite,对于:
SELECT LENGTH('a' || CHAR(0) || 'b')
Run Code Online (Sandbox Code Playgroud)
会回来1,
但是 Java,对于:
String s = "a" + Character.toString('\0') + "b";
System.out.println("" + s.length());
Run Code Online (Sandbox Code Playgroud)
会回来3。
在某些情况下,长度可能不同,Java 使用 UTF-16 来表示内部字符串,因此某些类型的字符需要一个代理对来存储在内存中。Java 的 String.length() 没有考虑到这一点。
使用表情符号字符的简单示例
class HelloWorld {
public static void main(String[] args) {
System.out.println("".length());
}}
Run Code Online (Sandbox Code Playgroud)
这将打印 2。
另一方面,sqlite 的文档说明:
对于字符串值 X,length(X) 函数返回 X 中第一个 NUL 字符之前的字符数(不是字节数)。
它指定对字符进行计数
sqlite> select length('');
Run Code Online (Sandbox Code Playgroud)
这将返回 1。
这不是“表情符号”独有的,对于某些具有“高”代码点字符(如某些亚洲字符)的语言也是如此
使用 sqlite 3.28.0 和 openjdk 版本“1.8.0_252”进行测试。我认为它应该适用于您的堆栈。
| 归档时间: |
|
| 查看次数: |
346 次 |
| 最近记录: |