JavaScript 中的巨大字符串替换?

2024-06-18

我有一个小型 JavaScript 应用程序,可以解析用户放入浏览器中的文件。最近我发现一些非英语字符的问题。此处放置的文件类型使用 Windows-1252 字符集,因此诸如ñ,实际上是通过ñ我必须将它们全部转换为正确的字符。

例如,我得到Señor应该是Señor在西班牙语中。

我找到了一个非常有用的网站 http://www.i18nqa.com/debug/utf8-debug.html包含字符的集合以及我需要转换为的对应字符。

我将其压缩为两个 JavaScript 数组:

var toReplace = ["À", "Ã", "Â", "Ã", "Ä", "Ã…", "Æ", "Ç", "È", "É", "Ê", "Ë", "ÃŒ", "Ã", "ÃŽ", "Ã", "Ã", "Ñ", "Ã’", "Ó", "Ô", "Õ", "Ö", "×", "Ø", "Ù", "Ú", "Û", "Ãœ", "Ã", "Þ", "ß", "Ã", "á", "â", "ã", "ä", "Ã¥", "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï", "ð", "ñ", "ò", "ó", "ô", "õ", "ö", "÷", "ø", "ù", "ú", "û", "ü", "ý", "þ", "ÿ"];
var replaceWith = ["À", "Á", "Â", "Ã", "Ä", "Å", "Æ", "Ç", "È", "É", "Ê", "Ë", "Ì", "Í", "Î", "Ï", "Ð", "Ñ", "Ò", "Ó", "Ô", "Õ", "Ö", "×", "Ø", "Ù", "Ú", "Û", "Ü", "Ý", "Þ", "ß", "à", "á", "â", "ã", "ä", "å", "æ", "ç", "è", "é", "ê", "ë", "ì", "í", "î", "ï", "ð", "ñ", "ò", "ó", "ô", "õ", "ö", "÷", "ø", "ù", "ú", "û", "ü", "ý", "þ", "ÿ"];

替换段落中所有字符的最有效方法是什么toReplace与它的对应项(相同的索引)replaceWith?

我希望这不会造成太多循环,因为将超过 100 个文件放入这个已经进行了一些繁重循环和解析的应用程序中并不罕见。

也许有更好的方法来做到这一点,而不是将这些字符保留在数组中?

EDIT- 我刚刚意识到我可能需要替换为 unicode eqivilent。这是一个按相同顺序排列的 unicode 字符数组:

var unicodeReplaceWith= ["\u00C0", "\u00C1", "\u00C2", "\u00C3", "\u00C4", "\u00C5", "\u00C6", "\u00C7", "\u00C8", "\u00C9", "\u00CA", "\u00CB", "\u00CC", "\u00CD", "\u00CE", "\u00CF", "\u00D0", "\u00D1", "\u00D2", "\u00D3", "\u00D4", "\u00D5", "\u00D6", "\u00D7", "\u00D8", "\u00D9", "\u00DA", "\u00DB", "\u00DC", "\u00DD", "\u00DE", "\u00DF", "\u00E0", "\u00E1", "\u00E2", "\u00E3", "\u00E4", "\u00E5", "\u00E6", "\u00E7", "\u00E8", "\u00E9", "\u00EA", "\u00EB", "\u00EC", "\u00ED", "\u00EE", "\u00EF", "\u00F0", "\u00F1", "\u00F2", "\u00F3", "\u00F4", "\u00F5", "\u00F6", "\u00F7", "\u00F8", "\u00F9", "\u00FA", "\u00FB", "\u00FC", "\u00FD", "\u00FE", "\u00FF"];

我不太了解 JavaScript 的速度,也不知道为什么不能在服务器上正确配置,但这是一种方法。

互动演示 http://codepen.io/brigand/pen/gwIoG

首先我们把所有东西都变成一个对象,这样我们就可以查找翻译。

var map = {};
for (var i=0; i<toReplace.length; i++) {
  map[toReplace[i]] = replaceWith[i];
}

Then we join our keys into a regular expression
(note: they must be sorted longest-first, code in the demo).

var expression = new RegExp(toReplace.join("|"), "g");

在替换函数中,我们可以用匹配项替换结果。这就像在我们的中查找它们一样简单map.

function doReplace(source) {
  return source.replace(expression, function(m) {
    return map[m];
  });
}

var result = doReplace("Señor");
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JavaScript 中的巨大字符串替换? 的相关文章

随机推荐

  • 如何获得 Elixir 中每种类型的最小值和最大值

    如何获得 Elixir 中每种类型的最小值和最大值 例如整数 浮点数和字符串的最大可能长度 我知道在C中它的定义是limits h as INT MIN INT MAX等等 关于 Elixir 中这些类型的限制的文档在哪里 Elixir 实
  • 如何使用 SVG 形状进行图像裁剪?

    任何人都可以指导我如何使用 SVG 独特的形状制作 CSS 图像剪辑路径 有些人建议使用第三方插件 例如 SVG Injector 等 任何人都可以帮助我如何完成这项适用于所有浏览器的任务 我给出了一张示例图片以使其更好地理解 请检查下图
  • 使用 Internet Explorer 和 SSL 时如何启用自动完成功能?

    当以下两个条件都成立时 1 The page was delivered over HTTPS 2 The page was delivered with headers or a META tag that prevents cachin
  • Vim 搜索模式,如果出现则删除到行尾

    我正在尝试在文本文件中搜索特定模式 如果出现这种模式 则意味着该行的其余部分不需要 因此可以删除 我尝试过使用以下命令 但到目前为止还没有成功 s pattern d g pattern d 如果有人有任何建议 他们将不胜感激 would
  • 数据透视表错误 |无效的调用或过程

    我需要一些帮助来解决这个问题 我正在尝试创建一个数据透视表 从第一季度开始 在同一张表中包含一系列数据 第一个 if 语句在那里是因为最后一列并不总是包含标题 所以我将其包含在那里 我希望范围是动态的 因为所制作的表格的大小将根据工作表中数
  • 从 swift 数组创建张量

    这工作正常 import TensorFlow var t Tensor
  • “引擎”和“框架”有什么区别? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我听说这些术语似乎可以互换使用 所以我有点不清楚 请举出例子 这些术语和其他术语看起来确实非常相似 它们是从概念角度命名的 因此可以定
  • Valgrind 对未初始化的字节大喊大叫

    Valgrind 抛出了这个错误 11204 Syscall param write buf points to uninitialised byte s 11204 at 0x4109033 write in lib libc 2 13
  • 如何使用魔杖扭曲图像

    我正在尝试做同样的事情this https stackoverflow com questions 52090350 how to insert image in a mock up老问题但在python using wand 到目前为止我
  • 使用 Symfony 4 命令加载不同的 .env 文件

    env运行 Symfony 4 命令时会解析文件 如果 dotenv 可用 这在开发时工作正常 而且 我想测试我的代码 所以另一个环境 因此我需要加载另一个 env file 我喜欢 Docker 运行容器的方式 docker run e
  • 如何在没有副本的情况下将结构转换为字节数组?

    StructLayout LayoutKind Explicit public struct struct1 FieldOffset 0 public byte a 1 byte FieldOffset 1 public int b 4 b
  • 为什么Java中的FileChannel不是非阻塞的?

    我想编写一个同时写入多个文件的程序 认为通过使用非阻塞模式可以用一个线程来实现 但FileChannel不支持非阻塞模式 有人知道为什么吗 UNIX 不支持文件的非阻塞 I O 请参阅常规文件的非阻塞 I O http www remlab
  • 了解SD卡路径Android的最佳方法

    我需要知道大多数设备中的 SD 卡路径 我实际使用时遇到一些问题 Environment getExternalStorageDirectory 但有些手机无法返回正确的路径 我不知道为什么 检查不同设备和操作系统版本的 SD 卡路径的最佳
  • 为什么有时 npm install 在 mac 上不起作用?

    我在运行命令时创建了nodejs项目npm 安装它因一些错误而失败 同一个项目正在进行中ubuntu系统但是当我克隆这个代码时mac系统并尝试运行 npm install 它失败并出现一些错误 我认为 scrypt 模块有问题 但我不知道确
  • 退出时的 Powerpoint 问题

    我有一些 C 代码 可以打开 Powerpoint 幻灯片 刷新图表 然后退出 这工作正常 除非用户已经打开了 Powerpoint 幻灯片 在这种情况下 一旦 exe 运行 它将关闭他们现有的会话 丢失他们可能所做的任何更改 所以 问题是
  • finish() 和 System.exit(0) 之间的区别

    我说的是android中的编程 早期我以为 finish 关闭当前活动并返回到 Activity 堆栈中的上一个 并且System exit 0 关闭整个应用程序 但是我错了 我做了一个小实验并了解到两者都只会完成当前的 Activity
  • 为什么静态向下转型 unique_ptr 不安全?

    我指的是一个后续问题 向下转型 unique ptr 到 unique ptr https stackoverflow com questions 21174593 downcasting unique ptrbase to unique
  • Matlab dec2bin 给出错误的值

    我正在使用 Matlab 的 dec2bin 将十进制数转换为二进制字符串 但是 我得到了错误的结果 例如 gt gt dec2bin 13339262925365424727 ans 101110010001111010010100111
  • 在 C++ 中检查文件是否存在的最佳方法是什么? (跨平台)

    我已阅读以下答案检查 C 中文件是否存在的最佳方法是什么 跨平台 https stackoverflow com questions 230062 whats the best way to check if a file exists i
  • JavaScript 中的巨大字符串替换?

    我有一个小型 JavaScript 应用程序 可以解析用户放入浏览器中的文件 最近我发现一些非英语字符的问题 此处放置的文件类型使用 Windows 1252 字符集 因此诸如 实际上是通过 我必须将它们全部转换为正确的字符 例如 我得到S