获取字符串真实长度和取固定长度的字符串函数,可以方便地进行字符串截取和限制。
获取字符串真实长度
常规的字符串长度获取方式是使用 str.length
,但这种方式对于非 ASCII 字符(如中文、日文、韩文等)是不准确的,因为每个非 ASCII 字符占用的字节不同。解决这个问题的方法是使用 encodeURIComponent
将字符串编码为 URI 组件,然后获取其长度。
具体示例如下:
/**
* 获取字符串真实长度
* @param {String} str 要计算长度的字符串
* @return {Number} 字符串的真实长度
*/
function getRealLength(str) {
return encodeURIComponent(str).replace(/%[A-F\d]{2}/g, 'U').length;
}
// 示例
getRealLength('Hello, 世界!'); // 14
在示例中,比较简单的是首先使用 encodeURIComponent
将字符串转换成 URI 组件。对于非 ASCII 字符,该函数会将其进行编码,如中文字符编码为 %E4%BD%A0%E5%A5%BD
。接着使用正则表达式 /%[A-F\d]{2}/g
匹配所有编码后的字符串,将其替换为单个字符(此处使用了字符 U),最终得到编码后的字符串长度。
取固定长度的字符串
截取字符串是常见的需求,如果直接使用 substr
或 substring
方法,会涉及到字符编码问题,容易造成乱码或半个字符的截取。为此,我们需要自己实现一个截取固定长度的字符串函数。
具体示例如下:
/**
* 截取固定长度的字符串
* @param {String} str 要截取的字符串
* @param {Number} length 需要截取的长度
* @param {String} ellipsis 字符串结尾省略的符号,默认为 ...
* @return {String} 截取后的字符串
*/
function cutString(str, length, ellipsis = '...') {
let res = '',
count = 0;
for (let i = 0; i < str.length; i++) {
const c = str.charAt(i);
if (/[\u4e00-\u9fa5]/.test(c)) { // 判断是否是中文字符
count += 2;
} else {
count += 1;
}
if (count > length) {
break;
}
res += c;
}
return res + (count > length ? ellipsis : ''); // 添加省略号
}
// 示例
const str = "这是一段测试字符串,包含中文和英文的长度测试。";
cutString(str, 20); // 这是一段测试字符串
cutString(str, 10, '...'); // 这是一...
在示例中,我们先用 count
统计累计的字符长度。在遍历字符串时,对于中文字符我们将计数器加 2,其他字符加 1,这个方式可以避免截取出现半个中文字符的情况。最后将截取后的字符串加上省略号 ellipsis
返回。
注意,以上的截取方式是以某一字符长度为基准进行截取。如果需要保证截取结果精确地完整某个单词、句子或段落,可能需要进行进一步的判断和截取。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:JS版获取字符串真实长度和取固定长度的字符串函数 - Python技术站