如何为中文等特殊字符获取一定长度的子字符串
例如,如果描述是英文的,我可以使用 {description?substring(0, 80)}
获取 80 个字符,但是对于中文字符,我只能获取大约 10 个字符,并且存在垃圾始终以 char 结尾。
我怎样才能获得任何语言的 80 个字符?
For example, I can get 80 chars with {description?substring(0, 80)}
if description is in English, but for Chinese chars, I can get only about 10 chars, and there is a garbage char at the end always.
How can I get 80 chars for any language?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
FreeMarker 依赖
String#substring
进行实际的(基于 UTF-16 字符?)子字符串计算,这对于中文字符来说效果不佳。相反,我们应该使用 Unicode 代码点。基于 这篇文章 和 FreeMarker 自己的子字符串内置函数我将 FreeMarkerTemplateMethodModelEx
实现组合在一起,该实现在代码点上运行:您可以放置一个实例例如,将其放入您的数据模型根目录中,
并在 FTL 中使用自定义子字符串方法:
我使用非中文字符对其进行了测试,该方法仍然有效,但到目前为止我还没有尝试使用中文字符。也许你想尝试一下。
FreeMarker relies on
String#substring
to do the actual (UTF-16-chars-based?) substring calculation, which doesn't work well with Chinese characters. Instead one should uses Unicode code points. Based on this post and FreeMarker's own substring builtin I hacked together a FreeMarkerTemplateMethodModelEx
implementation which operates on code points:You can put an instance of it into your data model root, e.g.
and use the custom substring method in FTL:
I tested it with non-Chinese characters, which still worked, but so far I haven't tried it with Chinese characters. Maybe you want to give it a try.