- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在查看一个与排序相关的问题时,我发现字符串 localeCompare
之间非字母数字字符比较的有趣差异方法和条件运算符(如 >,<
)。
您可以通过在不同浏览器中运行以下代码片段来查看它们之间的区别。
function comparison1(param1, param2){
return param1 > param2;
}
function comparison2(param1, param2){
return param1.localeCompare(param2);
}
document.getElementById("comparison11").innerHTML = comparison1('A', 'B');
document.getElementById("comparison12").innerHTML = comparison2('A', 'B');
document.getElementById("comparison21").innerHTML = comparison1('@', '_');
document.getElementById("comparison22").innerHTML = comparison2('@', '_');
<div>
<div style="float: left, width: 100%">
'A' > 'B'
</div>
<div style="float: left, width: 100%" id="comparison11"></div>
<div style="float: left, width: 100%">
'A'.localeCompare('B')
</div>
<div style="float: left, width: 100%" id="comparison12"></div>
<div style="float: left, width: 100%">
'@' > '_'
</div>
<div style="float: left, width: 100%" id="comparison21"></div>
<div style="float: left, width: 100%">
'@'.localeCompare('_')<br/>
<i>returns -1 in IE and Edge but 1 in Chrome and Firefox</i>
</div>
<div style="float: left, width: 100%" id="comparison22"></div>
</div>
<script>
</script>
如您所见,在使用 localeCompare
时比较“@”和“_”时,响应有所不同。方法和>
Chrome 和 Firefox 中的运算符。
我们实现了对具有不同数据类型的多列调用的排序比较方法。所以我们使用了条件运算符,但正如您所见,它在不同的浏览器中为非字母数字字符提供了不同的结果。
这是我的问题!
为什么不同浏览器对特殊字符的响应不同?
什么是实现这个的正确方法? (检查数据类型;如果字符串使用 localeCompare else 条件运算符?)
最佳答案
Why different response for special characters in different browsers?
可能是因为它在 ECMA-402 (internationalization) spec 中说:
Subsets of Unicode: Some operations, such as collation, operate on strings that can include characters from the entire Unicode character set. However, both the Unicode standard and the ECMAScript standard allow implementations to limit their functionality to subsets of the Unicode character set. In addition, locale conventions typically don’t specify the desired behaviour for the entire Unicode character set, but only for those characters that are relevant for the locale. While the Unicode Collation Algorithm combines a default collation order for the entire Unicode character set with the ability to tailor for local conventions, subsets and tailorings still result in differences in behaviour.
最有可能的是,@
与 _
的顺序在您使用的区域设置(或我的;英国英语)中没有明确定义,因此您得到“行为差异”。
What is correct way to implement this? (Check data type; if string use localeCompare else conditional operator?)
是的。 >
和 <
使用 Unicode 标准中代码点的数字关系,这根本不是处理排序规则的好方法,而 localeCompare
为字符提供了特定于语言环境的排序规则。
明确一点:当您说您“...使用了条件运算符”时,我假设您指的是条件运算符 ( ? :
) 与关系运算符(在本例中为 >
或 <
) ,例如像这样的东西:
return a === b ? 0 : a > b ? 1 : -1;
...或类似的 sort
回调。
但请注意,由于您现在将 localeCompare
用于字符串,并且唯一可以真正有意义地与 >
和 <
进行比较的是数字,因此对于数字有更好的解决方案如果您不知道其中有 NaN
:只需减去:
return a - b; // For numbers that aren't NaN
(如果它们中的任何一个可能是 NaN
,您将要处理它——或许使用条件运算符。:-))
关于javascript - JavaScript 中特殊字符的 localCompare 和比较运算符之间的不同结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42482978/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求提供代码的问题必须表现出对所解决问题的最低限度理解。包括尝试过的解决方案、为什么它们不起作用,以及预
为什么在 C# 中添加两个 char 结果是 int 类型? 例如,当我这样做时: var pr = 'R' + 'G' + 'B' + 'Y' + 'P'; pr 变量变为 int 类型。我希望它是
下面的代码可以编译,但 char 类型的行为与 int 类型的行为不同。 特别是 cout ::ikIsX >() ::ikIsX >() ::ikIsX >() using names
我正在寻找一个正则表达式,它可以匹配长度为 1 个或多个字符但不匹配 500 的内容。这将在 Rails 路由文件中使用,特别是用于处理异常。 路线.rb match '/500', to: 'err
对于 C 编程作业,我正在尝试编写几个头文件来检查所谓的“X 编程语言”的语法。我最近才开始,正在编写第一个头文件。这是我编写的代码: #ifndef _DeclarationsChecker_h_
为什么扩展的 ascii 字符(â、é 等)被替换为 字符? 我附上了一张图片...但我正在使用 PHP 从 MySQL 中提取数据,其中一些位置有扩展字符...我使用的是 Arial 字体。 您可以
我有一个与 R 中的断线相关的简单问题。 我正在尝试粘贴,但在获取(字符/数字)之间的断线时遇到问题。请注意,这些值包含在向量中(V1=81,V2=55,V3=25)我已经尝试过这段代码: cat(p
如何将 ANSI 字符 (char) 转换为 Unicode 字符 (wchar_t),反之亦然? 是否有用于此目的的任何跨平台源代码? 最佳答案 是的,在 中你有mbstowcs()和 wcsto
函数 fromCharCode 不适用于国际 ANSI 字符。例如,对于 ID 为 192 到 223 的俄语 ANSI (cp-1251) 字符,它返回特殊字符。如何解决这个问题? 我认为,需要将A
如果不喜欢,我想隐藏 id,但不起作用 SELECT * FROM character, character_actor WHERE character.id NOT LIKE character_a
现在这个程序成功地反转了键盘输入的单词。但是我想在我反转它之前“保存”指针中的单词,所以我可以比较两者,反转的和“原始的”,并检查它们是否是回文。我还没有太多经验,可能会出现比我知道的更多的错误,但我
Memcpy 和 memcmp 函数可以接受指针变量吗? char *p; char* q; memcpy(p,q,10); //will this work? memcmp(p,q,10); //w
恐怕我对一个相当过饱和的主题的细节有疑问,我搜索了很多,但找不到一个明确的答案来解决这个特定的明显-imho-重要的问题: 使用UTF-8将byte[]转换为String时,每个字节(8bit)都变成
我有一个奇怪的问题。我需要从 stat 命令打印输出字符串。 我已经编写了获取一些信息的代码。 import glob import os for file in glob.glob('system1
我正在使用 Java 并具有其值如下所示的字符串, String data = "vale-cx"; data = data.replaceAll("\\-", "\\-\\"); 我正在替换其中的“
String urlParameters = "login=test&password=te&ff"; 我有一个String urlParams,& - 是密码的一部分,如何使其转义,从而不被识别为分
大家好,我只想从此字符串中提取第一个字母: String str = "使 徒 行 傳 16:31 ERV-ZH"; 我只想获取这些字符: 使 徒 行 傳 并且不包括 ERV-ZH 仅数
这个问题已经有答案了: Crash or "segmentation fault" when data is copied/scanned/read to an uninitialized point
所以, 我有一个字符**;它本质上是一个句子,带有指向该句子中每个单词的指针;即 'h''i''\0''w''o''r''l''d''\0''y''a''y''!''\0' 在这种情况下,我希望使用可
这个问题在这里已经有了答案: Using quotation marks inside quotation marks (12 个答案) 关闭 7 年前。 如何打印 " 字符? 我知道打印 % 符号
我是一名优秀的程序员,十分优秀!