【问题标题】:how to write a twitter style word counter which is based on Encoding?如何编写基于编码的 twitter 风格的单词计数器?
【发布时间】:2012-06-29 09:25:47
【问题描述】:

我的表中有一个类型为TINYTEXT 的字段。该字段的编码为UTF8-UNICODE-ci。如果中国人在该字段中输入内容,则限制为 88 个字符,但如果伊朗人在波斯语中输入内容,则限制为 135 个字符,依此类推。所以最大文本长度根据 unicode 变化。如何克服这种情况并有一个基于特定语言的单词计数器?
有办法吗?我找不到它的方法;(

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

【问题讨论】:

  • 如果您切换到 UTF-16,您将获得所有语言的 128 个字符,否则您可以计算文本的字符和字节数(我猜 jquery 可以做到这一点,例如 phps strlen 和 mb_strlen),并且计算平均字节/字符,然后计算剩余字节数/(平均字节/字符)
  • 问题在于 UTF-16 仅在 MySQL 5.5 和 5.6 中可用

标签: jquery mysqli counter


【解决方案1】:

“字数计数器”我假设您的意思是“字符计数器”,因为您的问题涉及字符。

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

  1. 需要一种方法来计算 UTF-8 字符串中的字节数。谢天谢地,其他人已经answered了这个问题:

    encodeURIComponent(text).replace(/%[A-F\d]{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 字段的长度由多个字符而不是字节定义。这样做意味着您的字符数可以稳定且正确。

【讨论】:

  • 对不起,我的意思是字符计数器。当我在 textarea 中输入 س 时,计数器显示 2!实际上是一个字母而不是两个。
  • @phpGeek 您想要“字符数”计数还是“需要存储的字节数”计数? س 是 1 个字符,但需要 2 个字节来存储(以 UTF-8 编码)。如果您想要“字符数”计数,您可以使用 string.length
  • 我赏金给你,谢谢你的更新。答案在于将 tinytext 更改为 varchar,否则无法正确完成任务。
【解决方案2】:

您可以从 mysql 获取 UTF-8 并在计数之前将其转换为 javascript 中的 UTF-16。我似乎记得我曾经做过这样一个转换的旧项目。

编辑:我们使用的代码似乎源自here

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-29
      • 1970-01-01
      • 1970-01-01
      • 2016-03-21
      • 1970-01-01
      • 2015-11-15
      相关资源
      最近更新 更多