JavaScript - 如何转换unicode字符?英文数字到波斯数字

时间:2017-11-08 15:09:56

标签: javascript string unicode character-encoding

我正在构建一个从用户获取整数并进行一些计算然后输出结果的软件。问题是我想使用英文数字(0, 1, 2, etc.)来获取用户数字,我想在输出中使用波斯数字(如阿拉伯语)来表示数字。我已经阅读了有关Unicode转换的一些主题以及replace()charCodeAt()之类的内容,但我无法理解代码。

这是一段代码。(它将波斯语数字转换成英文数字,​​但我想做相反的事情。)

 var yas ="٠١٢٣٤٥٦٧٨٩";
 yas = Number(yas.replace(/[٠١٢٣٤٥٦٧٨٩]/g, function (d) {
     return d.charCodeAt(0) - 1632;                
     }).replace(/[۰۱۲۳۴۵۶۷۸۹]/g, function (d) { return d.charCodeAt(0) - 1776; })
 );

2 个答案:

答案 0 :(得分:3)

波斯语到英语的剧本似乎不必要地复杂化,这让我想知道我是否错过了什么。

基本上,有了这么有限的数据集,最简单的方法就是给自己一张地图:



// The "Persian" here aren't just Persian, nor are the English just English.
// Both numeral sets are used in multiple languages...

// One time setup
var persian ="٠١٢٣٤٥٦٧٨٩";
var mapPtoE = Object.create(null);
var mapEtoP = Object.create(null);
persian.split("").forEach(function(glyph, index) {
  mapPtoE[glyph] = index;
  mapEtoP[index] = glyph;
});
// Convert one char "Persion" => "English"
function charPtoE(ch) {
  return mapPtoE[ch] || ch;
}
// Convert one char "English" => "Persion"
function charEtoP(ch) {
  return mapEtoP[ch] || ch;
}
// Convert the "Persian" digits in a string to "English"
function strPToE(s) {
  return s.replace(/[٠١٢٣٤٥٦٧٨٩]/g, charPtoE);
}
// Convert the "English" digits in a string to "Persian"
function strEToP(s) {
  return s.replace(/\d/g, charEtoP);
}

// Demonstrate converting "Persian" to "English"
console.log("Test A ٠١٢٣", "=>", strPToE("Test A ٠١٢٣"));
console.log("Test B ٦٥٤", "=>",  strPToE("Test B ٦٥٤"));
console.log("Test C ٧٨٩", "=>",  strPToE("Test C ٧٨٩"));

// Demonstrate converting "English" to "Persian"
console.log("Test A 0123", "=>", strEToP("Test A 0123"));
console.log("Test B 654", "=>",  strEToP("Test B 654"));
console.log("Test C 789", "=>",  strEToP("Test C 789"));




从你的问题来看,4和6可能有多个表格(请原谅我的无知);如果是这样,你会想要调整上面的内容来处理“波斯语”中的内容。到"英语"转换,并选择一个使用另一种方式。

答案 1 :(得分:1)

您发布的代码看起来像处理阿拉伯语和波斯语数字。要转换回来,您可以使用

var yas ="1234567890";

// To Arabic digits
yas = yas.replace(/[0-9]/g, function (d) {
    return d.charCodeAt(0) + 1632;    // 1632 == '٠' - '0'           
});

// To Persian digits
yas = yas.replace(/[0-9]/g, function (d) {
    return d.charCodeAt(0) + 1776;  // 1776 == '۰' - '0' 
});

取决于您要使用的集合。

数字1632和1776是常规数字的代码点与阿拉伯数字和波斯数字的代码点之间的差异。