gpt4 book ai didi

Android,日文字 rune 件名比较问题

转载 作者:行者123 更新时间:2023-11-29 00:47:07 25 4
gpt4 key购买 nike

我正在尝试将搜索字符串与文件名与 Android 上的递归目录搜索相匹配。问题是字符是日语,在某些情况下不匹配。例如,我试图匹配文件名开头的搜索字符串是“呼ぶ”。当我从 file.getName() 打印文件名时,这会准确反射(reflect)出来,例如打印到控制台的文件名以“呼ぶ”开头。但是当我对搜索字符串进行匹配时,例如fileName.startwith(“呼ぶ”),不匹配。

事实证明,当我打印正在搜索的文件名的子字符串时,第二个字符不同——单词是“呼ふ”而不是“呼ぶ”。如果我提取字节并打印十六进制字符,最后一个字节会相差 1——大概是“ぶ”和“ふ”之间的区别。

这是用来显示差异的代码:

    String name = soundFile.getName();
String string1 = question.kanji;


Log.d(TAG, "searching for : s1:" + question.kanji + " + " + question.hiragana + " + " + question.english);
Log.d(TAG, "name is: " + name);

Log.d(TAG, "question.kanaji.length(): " + question.kanji.length());
Log.d(TAG, "question.hiragana.length(): " + question.hiragana.length());


String compareStart = name.substring(0, string1.length() );

Log.d(TAG, "string1.length(): " + string1.length());
Log.d(TAG, "compareStart.length(): " + compareStart.length());

byte[] nameUTF8 = null;
byte[] s1UTF8 = null;
byte[] csUTF8 = null;

nameUTF8 = name.getBytes();
s1UTF8 = string1.getBytes();
csUTF8 = compareStart.getBytes();


Log.d(TAG, "nameUTF8.length: " + s1UTF8.length);
Log.d(TAG, "s1UTF8.length: " + s1UTF8.length);
Log.d(TAG, "csUTF8.length: " + csUTF8.length);

for (int i = 0; i < s1UTF8.length; i++) {
Log.d(TAG, "s1UTF8[i]: " + Integer.toString(s1UTF8[i] & 0xff, 16).toUpperCase());
}

for (int i = 0; i < csUTF8.length; i++) {
Log.d(TAG, "csUTF8[i]: " + Integer.toString(csUTF8[i] & 0xff, 16).toUpperCase());
}

for (int i = 0; i < nameUTF8.length; i++) {
Log.d(TAG, "nameUTF8[i]: " + Integer.toString(nameUTF8[i] & 0xff, 16).toUpperCase());
}

部分输出如下:

D/AnswerView(12078): searching for : s1:呼ぶ + よぶ + to call out,to invite
D/AnswerView(12078): name is: 呼ぶ よぶ to call out,to invite.mp3
D/AnswerView(12078): question.kanaji.length(): 2
D/AnswerView(12078): question.hiragana.length(): 2
D/AnswerView(12078): string1: 呼ぶ
D/AnswerView(12078): compareStart: 呼ふ
D/AnswerView(12078): string1.length(): 2
D/AnswerView(12078): compareStart.length(): 2
D/AnswerView(12078): string1.length(): 2
D/AnswerView(12078): compareStart.length(): 2
D/AnswerView(12078): nameUTF8.length: 6
D/AnswerView(12078): s1UTF8.length: 6
D/AnswerView(12078): csUTF8.length: 6
D/AnswerView(12078): s1UTF8[i]: E5
D/AnswerView(12078): s1UTF8[i]: 91
D/AnswerView(12078): s1UTF8[i]: BC
D/AnswerView(12078): s1UTF8[i]: E3
D/AnswerView(12078): s1UTF8[i]: 81
D/AnswerView(12078): s1UTF8[i]: B6
D/AnswerView(12078): csUTF8[i]: E5
D/AnswerView(12078): csUTF8[i]: 91
D/AnswerView(12078): csUTF8[i]: BC
D/AnswerView(12078): csUTF8[i]: E3
D/AnswerView(12078): csUTF8[i]: 81
D/AnswerView(12078): csUTF8[i]: B5
D/AnswerView(12078): nameUTF8[i]: E5
D/AnswerView(12078): nameUTF8[i]: 91
D/AnswerView(12078): nameUTF8[i]: BC
D/AnswerView(12078): nameUTF8[i]: E3
D/AnswerView(12078): nameUTF8[i]: 81
D/AnswerView(12078): nameUTF8[i]: B5
D/AnswerView(12078): nameUTF8[i]: E3
D/AnswerView(12078): nameUTF8[i]: 82
D/AnswerView(12078): nameUTF8[i]: 99
D/AnswerView(12078): nameUTF8[i]: 20
D/AnswerView(12078): nameUTF8[i]: 20
D/AnswerView(12078): nameUTF8[i]: 20
D/AnswerView(12078): nameUTF8[i]: 20

显示提取的文件名子字符串的第六个字节以及文件名本身是“B5”而不是搜索字符串中的“B6”。但是,正确显示打印的文件名。我很难过。当底层字符不同时,为什么文件名可以正确显示到控制台?为什么在文件名的开头有额外的 3 个非空白字节 - 在搜索字符串中不需要以某种方式表示“ぶ”字符?

最佳答案

问题看起来是规范化形式之一。我知道,例如,在 Mac 上,文件系统总是在 NFD 中。但是您发布的字符串在 NFC 中。观看:

% cat /tmp/u
呼ぶ

% uwc /tmp/u
Paras Lines Words Graphs Chars Bytes File
0 1 1 3 3 7 /tmp/u

% uniquote -v /tmp/u
\N{CJK UNIFIED IDEOGRAPH-547C}\N{HIRAGANA LETTER BU}

% nfd /tmp/u | uniquote -v
\N{CJK UNIFIED IDEOGRAPH-547C}\N{HIRAGANA LETTER HU}\N{COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK}

% nfc /tmp/u | uniquote -v
\N{CJK UNIFIED IDEOGRAPH-547C}\N{HIRAGANA LETTER BU}

所以我认为您将不得不考虑转换为 NFD。

顺便说一句,U+547C CJK 代码点恰好是来自 Unihan 数据库的:

 呼 U+547C Lo Han    CJK UNIFIED IDEOGRAPH-547C
Mandarin hu1 xu1
Cantonese fu1
JapaneseKun yobu
JapaneseOn ko
Korean ho
HanyuPinlu hu1(378) hu5(107)
Vietnamese hô

关于Android,日文字 rune 件名比较问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5784518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com