问题描述
我有一串阿拉伯字符:
var txt="یہ ایک جملہ ہے۔";
我想在这个字符串中找到某个字符(例如 ج)的位置。
alert (txt.indexOf("ج"));
我尝试使用 txt.indexOf() 函数,但发生了一些非常奇怪的事情:如果我实时指定字符串(包括:基本字符串和搜索字符串)(例如通过输入框或表单文本框),则它可以工作如预期。但是,当我将基本字符串的字符指定为硬编码的 JavaScript 行时,一切都会变得混乱。
当我 alert() 字符时,这些字符显示为一些奇怪的 ASCII 值(显示为 Ößùīñè 等)并且 indexOf 结果总是返回 -1(未找到)。最初我认为这是 js 文件编码的问题,以确保它支持扩展字符集。原来编码是 UTF-8,当我关闭然后重新打开文件时,字符在编辑器中显示得非常好。只有在使用 JavaScript 处理它们时才会出现问题。
我使用 notepad++ 作为代码编辑软件。
var txt="یہ ایک جملہ ہے۔";
console.log(txt.indexOf("ج"));
任何帮助将不胜感激。
解决方法
Notepad++ 有 5 种编码,正如我在评论中提到的,我已经使用 PowerShell 识别出默认的 UTF-8 并不适用于所有匈牙利字符,并且 UTF- 8-BOM 是正确的。
我可以在 Chrome 中重现该问题,但在 Firefox 中无法重现,使用以下内容(在桌面上,我没有在其他设备上检查):
将TextField
保存到5个不同编码并以编码命名的文件中,然后保存
alert("یہ ایک جملہ ہے۔")
到一个html文件并打开看UTF-8-BOM正确显示字符,UCS-2类型也是如此,而ANSI文件即使在Notepad ++中也无法显示字符。
我建议您在设置 -> 首选项 -> 新文档中设置默认值。
关于当输入来自网站时会发生什么:我认为当浏览器创建元素时,它正在控制它们的行为,并对字符进行编码以便可以复制它们,因此没有编码“冲突”,就像它即将到来一样来自一个文件并且已经被编码。