我正在尝试转换一些法语加拿大语的字符串,基本上,我希望能够在保留字母的同时取出字母中的法语重音符号.(例如转换é为e,所以crème brûlée会变成creme brulee)
实现这一目标的最佳方法是什么?
是否有更好的方法来摆脱重音并使这些字母与使用String.replaceAll()方法和逐个替换字母分开?例:
输入: or?pžsíáýd
输出: orcpzsiayd
它不需要包括所有带有重音符号的字母,如俄语字母或中文字母.
Java中的字符串处理是我努力学习做得好的事情.目前我想要一个字符串并替换我找到的任何字符.
这是我目前效率低下的(有点愚蠢的IMO)功能.它写的只是工作.
public String convertWord(String word)
{
return word.toLowerCase().replace('á', 'a')
.replace('é', 'e')
.replace('í', 'i')
.replace('ú', 'u')
.replace('ý', 'y')
.replace('ð', 'd')
.replace('ó', 'o')
.replace('ö', 'o')
.replaceAll("[-]", "")
.replaceAll("[.]", "")
.replaceAll("[/]", "")
.replaceAll("[æ]", "ae")
.replaceAll("[þ]", "th");
}
Run Code Online (Sandbox Code Playgroud)
我运行了1.000.000次,耗时8182ms.那么我应该如何进行更改此功能以提高效率呢?
解决方案:
将函数转换为此函数
public String convertWord(String word)
{
StringBuilder sb = new StringBuilder();
char[] charArr = word.toLowerCase().toCharArray();
for(int i = 0; i < charArr.length; i++)
{
// Single character case
if(charArr[i] == 'á')
{
sb.append('a');
}
// Char to two characters
else if(charArr[i] == 'þ') …Run Code Online (Sandbox Code Playgroud) 我是Android的新手,我正在使用SQLite进行查询.我的问题是,当我在字符串中使用重音时,例如
如果我做:
SELECT * FROM TB_MOVIE WHERE MOVIE_NAME LIKE '%a%' ORDER BY MOVIE_NAME;
Run Code Online (Sandbox Code Playgroud)
回归:
但如果我这样做:
SELECT * FROM TB_MOVIE WHERE MOVIE_NAME LIKE '%à%' ORDER BY MOVIE_NAME;
Run Code Online (Sandbox Code Playgroud)
回归:
我想在SQLite数据库中选择字符串而不关心重音和大小写.请帮忙.
我想知道是否有一种方法比较2个字符串并忽略使"noção"等于"nocao"的重音.它会像string1.methodCompareIgnoreAccent(string2);
在Android中创建SQLite数据库时,我设置了数据库语言环境 - db.setLocale(new Locale("cz_CZ")).这是一个捷克语的地方.
SELECT语句起作用并考虑区域设置,例如:
SELECT * from table WHERE name='sctzy' COLLATE LOCALIZED
Run Code Online (Sandbox Code Playgroud)
会找到条目'ščťžý'.
但使用LIKE将失败:
SELECT * from table WHERE name LIKE '%sctzy%' COLLATE LOCALIZED
Run Code Online (Sandbox Code Playgroud)
没有返回任何行.
BTW.Android中没有java.text.Normalized类.我以为我可以用标准化的文本制作第二列,删除特殊字符,这些字符将用于搜索 - 但我缺少一个类或方法如何规范化String.
我列出了一些比利时城市的变音字符:(Liège,Quiévrain,Franière等)我希望将这些特殊字符转换为与包含相同名称的大写字母进行比较,但没有变音符号( LIEGE,QUIEVRAIN,FRANIERE)
我首先尝试做的是使用大写:
LIEGE.contentEqual(Liège.toUpperCase())但这不合适,因为大写Liège是LIÈGE和不是LIEGE.
我有一些复杂的想法,比如替换每个角色,但这听起来很愚蠢而且过程很长.
关于如何以聪明的方式做到这一点的任何想法?
可以说我有角色Ú,Ù,Ü.所有这些都与英语U字面相似.
是否有一些列表或算法来执行此操作:
我不确定所有字体的Unicode字符的代码点是否相同?如果是的话,我想可以有一些简单的方法和有效的方法来做到这一点?
UPDATE
如果你正在使用Ruby,那么有一个可用于unicode的gem 可能会在某些情况下有所帮助.
我正试图让西里尔语成为拉丁文,所以我可以把它们放在网址中.我使用icu4j transliterator,但它仍然会给出这样奇怪的字符:Vil'ândimaa.它应该更像viljandimaa.当我复制那个网址时,这些字母会变成%..某些东西没用.
有谁知道怎么用icu4j把西里尔语变成az?
UPDATE
不能回答自己,但发现这个问题非常有用:将符号,口音字母转换为英文字母
我想将英语(i)的"I"的小写字母与土耳其语(i)的"İ"的小写字母相匹配.它们是相同的字形,但它们不匹配.当我做System.out.println("?".toLowerCase());字符i和打印点(此网站不能正确显示)
有没有办法匹配那些?(最好没有硬编码)我想让程序匹配与语言和utf代码无关的相同字形.这可能吗?
我测试了规范化没有成功.
public static void main(String... a) {
String iTurkish = "\u0130";//"?";
String iEnglish = "I";
prin(iTurkish);
prin(iEnglish);
}
private static void prin(String s) {
System.out.print(s);
System.out.print(" - Normalized : " + Normalizer.normalize(s, Normalizer.Form.NFD));
System.out.print(" - lower case: " + s.toLowerCase());
System.out.print(" - Lower case Normalized : " + Normalizer.normalize(s.toLowerCase(), Normalizer.Form.NFD));
System.out.println();
}
Run Code Online (Sandbox Code Playgroud)
结果未在网站中正确显示,但第一行(iTurkish)仍然具有? 接近小写的i.
目的和问题
这将是一个多语言词典.我希望程序能够识别"İFEL"以"if"开头.为了确保它们不区分大小写,我首先将两个文本转换为小写.İFEL成为i(点)fel并且"if"未被识别为其中的一部分