如何编写基于编码的Twitter样式单词计数器



我的表中有一个字段,其类型为 TINYTEXT 。 该字段的编码是UTF8-UNICODE-ci 。如果中国人在该字段中键入某些内容,则限制为88个字符,但如果伊朗人用波斯语键入某些内容,则大约有135个字符,依此类推。因此,最大文本长度因 unicode 而异。如何克服这种情况并拥有基于特定语言的单词计数器?
有没有办法?我找不到一种方法;(

PS:我已经阅读了整个jQuery API,但在PHP中找不到类似mb_strlen()的东西。

通过"单词计数器",我假设您的意思是"字符计数器",因为您的问题涉及字符。

构建此计数器有两个部分:

  1. 需要一种方法来计算 UTF-8 字符串中的字节数。值得庆幸的是,其他人已经回答了这个问题:

    encodeURIComponent(text).replace(/%[A-Fd]{2}/g, 'U').length
    
  2. 需要一种方法在每次用户键入内容时触发计数函数。我们可以使用keyup事件:

    $('textarea').keyup(function () { ... });
    

下面是一个完整的示例:http://jsfiddle.net/jefferyto/DWwQr/


更新:我想您要查找的是一个倒计时计数器,指示用户可以输入的剩余字符数。

从技术上讲,如果您假设 1 个字符包含多少字节,这并不难计算:

(characters left) = Math.floor((255 - (num bytes in string)) / (num bytes in character))

但从用户的角度来看,这不是一个好主意:

  1. 你会用什么作为num bytes in character

    如果使用 1,那么一开始计数器会说 255,但这仅适用于 ASCII 字符;用户将无法输入 255 个中文字符。

    您选择的任何数字对于部分用户来说都是不正确的。

  2. 当用户开始输入文本时,计数器不会像用户期望的那样以 1 比 1 倒计时,而是以难以理解的步骤(用户无法理解)倒计时。

    再次假设每个字符 1 个字节进行计算,在用户输入任何文本之前,计数器将显示 255。如果用户输入 4 字节字符,计数器将更改为 251。

    对于用户来说,他们输入了 1 个字符但计数器减少了其他一些数字是没有意义的。

我建议使用 VARCHAR 而不是 TINYTEXT;VARCHAR 字段的长度是用许多字符而不是字节定义的。这样做意味着您的字符数可以稳定且正确。

你可以从mysql获取UTF-8,并在计数之前将其转换为javascript中的UTF-16。我似乎记得我执行这种转换的一个旧项目。

编辑:我们使用的代码似乎起源于这里。

可能会

对 http://tympanus.net/codrops/2009/11/08/jmaxinput-twitter-like-textarea/有所帮助我用这个 س 检查了它,它将其算作一个字符。

最新更新