我想在我想要的语言环境中将字符串转换为JavaScript中的大小写.我认为标准功能喜欢toUpperCase()并且toLocaleUpperCase()不满足这种需求.toLocale函数不能正常运行.
例如,在我的系统上的Safari 4,Chrome 4 Beta,Firefox 3.5.x中,它会错误地转换带有土耳其语字符的字符串.该浏览器响应navigator.language为"en-US","tr","en-US"分别.但是Accept-Lang我无法在浏览器中找到用户的设置."tr"虽然我已经将每个浏览器土耳其语区域设置为首选,但只有Chrome会给我 我认为这些设置仅影响HTTP标头,但我们无法通过JavaScript访问这些设置.
在Mozilla文档中,它说
字符串中的字符将转换为...,同时尊重当前区域设置.对于大多数语言,这将返回相同的...
我认为它对土耳其语有效,它没有区别它配置为en或tr.在土耳其应该转换"D?NÇ"到"dinç"和"DINÇ"对"d?nç"反之亦然.
有没有满足这种需求的JavaScript库?我认为它不仅应该在用户的语言环境中正确转换,而且还应该支持通过locale参数进行转换.因为开发人员无法访问用户配置的首选语言.
在一些库的代码中(例如AngularJS,链接指向代码中的特定行),我可以看到使用自定义大小写转换函数而不是标准函数.假设在具有土耳其语语言环境的浏览器中,标准函数不能按预期工作,这是合理的:
console.log("SCRIPT".toLowerCase()); // "scr?pt"
console.log("script".toUpperCase()); // "SCR?PT"
Run Code Online (Sandbox Code Playgroud)
但这是真的还是一直如此?浏览器真的有这样的表现吗?如果是这样,他们中的哪一个呢?node.js怎么样?其他JS引擎?
这些toLocaleLowerCase和toLocaleUpperCase方法的存在意味着toLowerCase并且toUpperCase是区域不变的,不是吗?
对于什么样的浏览器,具体而言,它的角团队保留此检查的代码:if ('i' !== 'I'.toLowerCase())...?
如果您的浏览器(设备)使用土耳其语或阿塞拜疆语区域设置,请运行此代码段并在发现问题确实存在时写信给我.
if ('i' !== 'I'.toLowerCase()) {
document.write('Ooops! toLowerCase is locale-sensitive in your browser. ' +
'Please write your user-agent in the comments to this question: ' +
navigator.userAgent);
} else {
document.write('toLowerCase isn\'t locale-sensitive in your browser. ' +
'Everything works as expected!');
}Run Code Online (Sandbox Code Playgroud)
<html lang="tr">Run Code Online (Sandbox Code Playgroud)
我们遇到的问题是文本以某种不同的方式编码,但保存在表格的单个列中.很长的故事.在MySQL上,我可以"从表中选择十六进制(str)",然后我看到字符串的字节与我设置它们完全相同.
在Oracle上,我有一个以土耳其字符İ开头的字符串,它是Unicode字符0x0130"带有上面点的拉丁文大写字母".这是我的Unicode 2.0版书的印刷版.在UTF-8中,该字符为0xc4b0.
我们需要支持非常旧的客户端应用程序.他们会在"windows-1254"中将此文本发送给我们.我们过去只是闭上眼睛,存放它,然后再将其交还.现在我们需要Unicode,或者被赋予Unicode.
所以我有:
SQL> select id, name from table where that thing;
ID NAME
------ ------------------------
746 Ý
Run Code Online (Sandbox Code Playgroud)
这是有道理的,因为"İ"在Windows-1254中是0xdd而wondows-1252中的0xdd是"Ý".我的终端大概设置为通常的windows-1252.
但:
SQL> select id, rawtohex(name) from table where that thing;
ID RAWTOHEX(NAME)
------ ------------------------
746 C39D
Run Code Online (Sandbox Code Playgroud)
似乎没有相当于MySQL中的hex(name)函数.但我必须遗漏一些东西.我在这里错过了什么?
我的java代码必须使用我提供的utf8并保存utf8副本和windows-1252副本.java代码给了我:
bytes (utf8): c4 b0
bytes (1254): dd
Run Code Online (Sandbox Code Playgroud)
然而,当我保存它时,客户端没有得到正确的字符.当我试图查看Oracle实际存储的内容时,我会看到上面看到的垃圾.我不知道C39D的来源.有什么建议?
我们在所有应用程序中都内置了ojdbc14.jar,并且我们正在连接到一个数据库,该数据库表示它是"Oracle Database 11g企业版版本11.2.0.2.0 - 64位生产".
我正在使用多语言文本数据,其中包括使用西里尔字母和土耳其语的俄语.我基本上要的话在比较两个文件my_file和check_file,如果在的话my_file可以发现check_file,把它们写在输出文件中保留约从两个输入文件这些词的元信息.
有些单词是小写的,而其他单词是大写的,所以我必须小写所有单词来比较它们.当我使用Python 3.6.5并且Python 3使用unicode作为默认值时,它会处理小写,然后为Cyrillic正确地大写单词.但是对于土耳其语,有些字母处理不正确.大写'?'应对应小写'i',大写'I'应对应小写'?',小写'i'应对应大写'?',如果我在控制台中键入以下内容则不是这种情况:
>>> print('?'.lower())
i? # somewhat not rendered correctly, corresponds to unicode 'i\u0307'
>>> print('I'.lower())
i
>>> print('i'.upper())
I
Run Code Online (Sandbox Code Playgroud)
我正在做如下(简化的示例代码):
# python my_file check_file language
import sys
language = sys.argv[3]
# code to get the files as lists
my_file_list = [['?spanak', 'N'], ['?s?r', 'N'], ['ac?k', 'V']]
check_file_list = [['109', 'Ispanak', 'food_drink'], ['470', 'Is?r', 'action_words'], [409, 'Ac?k', 'action_words']] …Run Code Online (Sandbox Code Playgroud) 我正在尝试用Java打印土耳其里拉(ISO 4217货币代码TRY)的价格.
当我做
Currency curr = Currency.getInstance("TRY");
Locale trLocale = new Locale("tr", "TR");
System.out.println(curr.getSymbol(trLocale));
Run Code Online (Sandbox Code Playgroud)
输出是:"YTL".
然而,土耳其里拉的货币符号最近已经从"YTL"变为"TL"(可以在土耳其里拉的维基百科页面上看到).格式化NumberFormat给出了类似的结果.
我真的不想写另一个Currency类,特别是当Java有一个内置的时候.
有没有办法将TRY的Java默认货币符号覆盖为"TL"?
我想使用JavaScript toLocaleUpperCase()方法来确保大写字母对于土耳其语言正常工作.但是,我无法确定将土耳其语设置为用户的语言环境.
在现代浏览器中是否有办法在运行时设置区域设置,如果我确定该字符串是土耳其语?
(我在考虑土耳其语时遇到了这个问题,但实际上它可以是任何其他语言.)
我想用正则表达式验证QLineEdit的文本.它应该允许从a到z的字符加上A到Z加上土耳其字符(ğüşöçİĞÜŞÖÇ)加上0到9之间的数字.我搜索了我的问题并找到了两个解决方案,但两个都没有为我工作.在一个解决方案中它说"在regexp中包含土耳其字符",在另一个解决方案中它说"使用土耳其字符的unicodes"
下面是两个reqular表达式
QRegExp exp = QRegExp("^[a-zA-Z0-9?ü?öç??Ü?ÖÇ]+$");
QRegExp exp = QRegExp("^[a-zA-Z0-9\u00E7\u011F\u0131\u015F\u00F6\u00FC\u00C7\u011E\u0130\u015E\u00D6\u00DC]+$");
Run Code Online (Sandbox Code Playgroud)
上面的reqular表达式都不能验证名称'İSMAİL'.此外,我试过一个文本只包含土耳其字符('ğüşöçİĞÜŞÖÇ')但它无法验证.当我从两个文本中删除"İ"字符时,可以对其进行验证.我想问题可能与'İ'字符有关.
我该如何解决这个问题?
注意:我们在项目中使用Qt 4.6.3.
看起来postgres upper/lower函数不处理土耳其字符集中的选择字符.
select upper('Aa?'), lower('Aa?') from mytable;
Run Code Online (Sandbox Code Playgroud)
回报:
AA?, aa?
Run Code Online (Sandbox Code Playgroud)
代替 :
AAI, aai
Run Code Online (Sandbox Code Playgroud)
请注意,正常的英文字符转换正确,但不是土耳其语I(较低或较高)
Postgres版本: 9.2 32 bit
数据库编码(其中任何一个都是相同的结果): UTF-8, WIN1254, C
客户端编码:
UTF-8, WIN1254, C
Run Code Online (Sandbox Code Playgroud)
OS: Windows 7 enterprise edition 64bit
SQL函数lower并upper在UTF-8编码数据库上为ı和İ返回以下相同的字节
\xc4b1
\xc4b0
Run Code Online (Sandbox Code Playgroud)
以及关于WIN1254(土耳其语)编码的数据库
\xfd
\xdd
Run Code Online (Sandbox Code Playgroud)
我希望我的调查是错误的,而且我错过了一些东西.
使用代码Ç?naralt? Café在文本中搜索文本时Ci
NSStringCompareOptions options =
NSCaseInsensitiveSearch |
NSDiacriticInsensitiveSearch |
NSWidthInsensitiveSearch;
NSLocale *locale = [NSLocale localeWithLocaleIdentifier:@"tr"];
NSRange range = [haystack rangeOfString:needle
options:options
range:NSMakeRange(o, haystack.length)
locale:locale];
Run Code Online (Sandbox Code Playgroud)
我得到了range.location平等NSNotFound.
这与初始Ç上的变音符号无关,因为我得到了相同的结果,搜索alti唯一奇怪的字符是ı.我也得到一个有效的匹配搜索Cafe包含变音符号(é).
苹果文档提到这种情况作为locale参数的注释,我想我正在关注它们.虽然我猜我不是因为它不起作用.
如何搜索"i"以匹配"i"和"ı"?
当使用带有默认语言环境的toUpperCase()或更有趣的是两个参数Locale构造函数时,我遇到了希腊语和土耳其语的问题.
问题发生在Galaxy Tab S2 Android 5.0.2上(也在5.1.1上重现)
该问题可通过设置应用程序和MoreLocale 2重现
考虑到这个标题的价值:Τέλοςσυνεδρίας
这些调用工作正常.
title.toUpperCase(new Locale("el_GR"))
title.toUpperCase(new Locale("el-GR"))
Run Code Online (Sandbox Code Playgroud)
两者都生成正确的结果.仔细观察,在T和P之后有刻度线.
ΤΈΛΟΣΣΥΝΕΔΡΊΑΣ
但是,我得到了默认语言环境和双参数Locale构造函数的不同结果.
这是我平板电脑上的默认语言环境:
Locale.getDefault() == el_GR
Run Code Online (Sandbox Code Playgroud)
哪个用于通用的toUpperCase()
public String toUpperCase() {
return CaseMapper.toUpperCase(Locale.getDefault(), this, value, offset, count);
}
Run Code Online (Sandbox Code Playgroud)
当我调用它时,它返回不正确的结果.
title.toUpperCase()
Run Code Online (Sandbox Code Playgroud)
注意T和P上缺少的刻度线.
ΤΕΛΟΣΣΥΝΕΔΡΙΑΣ
如果我将两个参数构造函数用于新的语言环境,我会得到相同的结果:
title.toUpperCase(new Locale("el","GR"))
Run Code Online (Sandbox Code Playgroud)
ΤΕΛΟΣΣΥΝΕΔΡΙΑΣ
将这些行添加到应用程序启动可以解决问题,但却相当苛刻.
String language = Locale.getDefault().getLanguage();
String country = Locale.getDefault().getCountry();
Locale.setDefault(new Locale(language + "-" + country));
Run Code Online (Sandbox Code Playgroud)
我宁愿简单地遵循默认语言环境.
turkish ×10
javascript ×3
java ×2
unicode ×2
android ×1
angularjs ×1
built-in ×1
currency ×1
cyrillic ×1
ios ×1
locale ×1
localization ×1
lowercase ×1
nsstring ×1
objective-c ×1
ojdbc ×1
oracle ×1
postgresql ×1
python ×1
python-3.x ×1
qt ×1
regex ×1
string ×1
uppercase ×1
utf-8 ×1