gpt4 book ai didi

freemarker - 如何为中文等特殊字符获取一定长度的子字符串

转载 作者:行者123 更新时间:2023-12-02 00:29:15 30 4
gpt4 key购买 nike

例如,如果描述是英文的,我可以用 {description?substring(0, 80)} 得到 80 个字符,但是对于中文字符,我只能得到大约 10 个字符,并且有始终是垃圾字符。

我怎样才能获得任何语言的 80 个字符?

最佳答案

FreeMarker 依赖于 String#substring 来进行实际的(基于 UTF-16 字符?)子字符串计算,这对中文字符来说效果不佳。相反,应该使用 Unicode 代码点。基于this post和 FreeMarker 自己的内置子字符串我一起破解了一个 FreeMarker TemplateMethodModelEx 实现,它在代码点上运行:

public class CodePointSubstring implements TemplateMethodModelEx {

@Override
public Object exec(List args) throws TemplateModelException {
int argCount = args.size(), left = 0, right = 0;
String s = "";
if (argCount != 3) {
throw new TemplateModelException(
"Error: Expecting 1 string and 2 numerical arguments here");
}
try {
TemplateScalarModel tsm = (TemplateScalarModel) args.get(0);
s = tsm.getAsString();
} catch (ClassCastException cce) {
String mess = "Error: Expecting numerical argument here";
throw new TemplateModelException(mess);
}

try {
TemplateNumberModel tnm = (TemplateNumberModel) args.get(1);
left = tnm.getAsNumber().intValue();

tnm = (TemplateNumberModel) args.get(2);
right = tnm.getAsNumber().intValue();

} catch (ClassCastException cce) {
String mess = "Error: Expecting numerical argument here";
throw new TemplateModelException(mess);
}
return new SimpleScalar(getSubstring(s, left, right));
}

private String getSubstring(String s, int start, int end) {
int[] codePoints = new int[end - start];
int length = s.length();
int i = 0;
for (int offset = 0; offset < length && i < codePoints.length;) {
int codepoint = s.codePointAt(offset);
if (offset >= start) {
codePoints[i] = codepoint;
i++;
}
offset += Character.charCount(codepoint);
}
return new String(codePoints, 0, i);
}
}

您可以将它的一个实例放入您的数据模型根目录中,例如

SimpleHash root = new SimpleHash();
root.put("substring", new CodePointSubstring());
template.process(root, ...);

并在 FTL 中使用自定义子字符串方法:

${substring(description, 0, 80)}

我用非汉字测试过,仍然有效,但到目前为止我还没有用汉字试过。也许您想尝试一下。

关于freemarker - 如何为中文等特殊字符获取一定长度的子字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7685491/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com