我的表中有一个字段,其类型为 TINYTEXT
。 该字段的编码是UTF8-UNICODE-ci
。如果中国人在该字段中键入某些内容,则限制为88个字符,但如果伊朗人用波斯语键入某些内容,则大约有135个字符,依此类推。因此,最大文本长度因 unicode 而异。如何克服这种情况并拥有基于特定语言的单词计数器?
有没有办法?我找不到一种方法;(
PS:我已经阅读了整个jQuery API,但在PHP中找不到类似mb_strlen()的东西。
通过"单词计数器",我假设您的意思是"字符计数器",因为您的问题涉及字符。
构建此计数器有两个部分:
-
需要一种方法来计算 UTF-8 字符串中的字节数。值得庆幸的是,其他人已经回答了这个问题:
encodeURIComponent(text).replace(/%[A-Fd]{2}/g, 'U').length
-
需要一种方法在每次用户键入内容时触发计数函数。我们可以使用
keyup
事件:$('textarea').keyup(function () { ... });
下面是一个完整的示例:http://jsfiddle.net/jefferyto/DWwQr/
更新:我想您要查找的是一个倒计时计数器,指示用户可以输入的剩余字符数。
从技术上讲,如果您假设 1 个字符包含多少字节,这并不难计算:
(characters left) = Math.floor((255 - (num bytes in string)) / (num bytes in character))
但从用户的角度来看,这不是一个好主意:
你会用什么作为
num bytes in character
?如果使用 1,那么一开始计数器会说 255,但这仅适用于 ASCII 字符;用户将无法输入 255 个中文字符。
您选择的任何数字对于部分用户来说都是不正确的。
当用户开始输入文本时,计数器不会像用户期望的那样以 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/有所帮助我用这个 س 检查了它,它将其算作一个字符。