我希望代码能够将字符串中的所有字符转换为Java中的大写或小写。
我找到了一个类似这样的方法:
public static String changelowertoupper()
{
String str = "CyBeRdRaGoN";
str=str.toLowerCase(Locale.ENGLISH);
return str;
}
现在我读过使用某些Locale
s,比如土耳其语,“返回 i(不带点) 而不是 我(带点) 。“
使用英国,美国,英国等Locale
是否安全?应用于字符串时,它们之间是否存在很大差异?
Locale
的首选String
是哪个?
答案 0 :(得分:61)
我认为你应该使用locale,
例如,土耳其语语言环境中的“TITLE”.toLowerCase()返回 “tıtle”,其中'ı'是LATIN SMALL LETTER DOTLESS I字符。至 获取区域设置不敏感字符串的正确结果,使用 toLowerCase(Locale.ENGLISH)。
我将这些链接称为您问题的解决方案 并且有必要记住你的情况“土耳其语”
**FROM THE LINKS**
toLowerCase()尊重国际化(i18n)。它执行 与您的区域设置相关的大小写转换。你打电话的时候 toLowerCase(),内部toLowerCase(Locale.getDefault())正在获取 调用。它是区域敏感的,你不应该写一个逻辑 它独立地解释语言环境。
import java.util.Locale;
public class ToLocaleTest {
public static void main(String[] args) throws Exception {
Locale.setDefault(new Locale("lt")); //setting Lithuanian as locale
String str = "\u00cc";
System.out.println("Before case conversion is "+str+
" and length is "+str.length());// Ì
String lowerCaseStr = str.toLowerCase();
System.out.println("Lower case is "+lowerCaseStr+
" and length is "+lowerCaseStr.length());// iı`
}
}
在上面的程序中,查看前后的字符串长度 转换。它将是1和3.是之前字符串的长度 案件转换后不同。你的逻辑会去折腾 当你在这个场景中依赖字符串长度时。当你的程序 在不同的环境中执行,它可能会失败。这将是一个 代码审查很好。
为了使其更安全,您可以使用其他方法 toLowerCase(Locale.English)并始终将语言环境覆盖为英语。 但是你没有国际化。
所以关键是,toLowerCase()是特定于语言环境的。
reference 1
reference 2
reference 3
Dotless-i,是一个没有点的小写'i'。这个角色的大写字母是通常的“我”。还有另一个角色,“我有点”。这个字符的小写字母通常是小写的“i”。
你注意到了这个问题吗?这种不对称的转换导致编程中的严重问题。我们主要在Java应用程序中遇到这个问题,因为(IMHO)toLowerCase和toUpperCase函数的实现很差。
在Java中,String.toLowerCase()方法根据默认语言环境将字符转换为小写。如果您的应用程序在土耳其语语言环境中工作,这会导致问题,特别是如果您将此函数用于文件名或必须遵守某个字符集的URL。
我之前在博客上发过两个严肃的例子:如果XPage位于名称中包含“I”的数据库中,脚本库中的名称为“i”,而XSP Manager出现错误则编译错误。
正如我所说,历史悠久。例如,在某些R7版本中,如果路由器名称以“I”开头,则无法向收件人发送消息。在R8之前,邮件报告代理未在土耳其语语言环境中运行。任何拥有土耳其语语言环境的人都无法安装Lotus Notes 8.5.1(这是真的!)。名单继续......
土耳其几乎没有beta测试人员,客户也不会因为这些问题而打开PMR。因此,这些问题不会成为开发团队的首要任务。
即使是Java团队也在最新文档中添加了一个特殊警告:
此方法对区域设置非常敏感,如果可能会产生意外结果 用于要解释语言环境的字符串 独立。示例是编程语言标识符,协议 键和HTML标记。例如,土耳其语中的“TITLE”.toLowerCase() locale返回“tıtle”,其中'ı'是LATIN SMALL LETTER DOTLESS I 字符。要获得区域设置不敏感字符串的正确结果, 使用toLowerCase(Locale.ENGLISH)。
请阅读我无法发布所有信息的链接“这是对您的评论的回复”
答案 1 :(得分:6)
您可以为String
的语言创建合适的区域设置。
例如:
toUpperCase(new Locale("tr","TR"));
将成为土耳其人的伎俩。
答案 2 :(得分:5)
String str = "CyBeRdRaGoN";
str = str.toLowerCase(); // str = "cyberdragon"
str = str.toUpperCase(); // str = "CYBERDRAGON"
您的应用程序将选择默认语言环境,因此如果有人将使用土耳其语语言环境运行您的应用程序,他将看到i
没有点
答案 3 :(得分:0)
如果您使用此函数检查字符串(例如搜索)可以安全地使用小写或大写形式的字符串进行检查。您可以这样使用它:
if (mViewData.list.data[i].Name.toLowerCase(new Locale("tr", "TR"))
.contains(mViewHolder.tctSearch.getText().toString().trim()
.toLowerCase(new Locale("tr", "TR")))) {
// your code here...
}
我面对同样的问题,但是在listview中搜索的情况。我添加了这个答案,它可以帮助那些有同样问题的人。
答案 4 :(得分:0)
在科特林
private fun changelowertoupper(): String {
val str = "CyBeRdRaGoN"
return str.toLowerCase(Locale.ROOT) // or Locale.getDefault()
}
答案 5 :(得分:0)
如果您愿意,可以在 XML 端使用 android:textLocale="tr"
选项。
<TextView
android:text="inciler"
android:textAllCaps="true"
android:textLocale="tr" />
输出:İNCİLER