src/string.js
import {
typeOf,
isUnset,
isString,
assert,
} from './base'
import { _padStart } from './internal/_pad'
/**
* @see https://www.cnblogs.com/dearxinli/p/7657512.html
* 计算字符串所占的内存字节数,默认使用UTF-8的编码方式计算,也可制定为UTF-16
* UTF-8 是一种可变长度的 Unicode 编码格式,使用一至四个字节为每个字符编码
*
* 000000 - 00007F(128个代码) 0zzzzzzz(00-7F) 一个字节
* 000080 - 0007FF(1920个代码) 110yyyyy(C0-DF) 10zzzzzz(80-BF) 两个字节
* 000800 - 00D7FF
00E000 - 00FFFF(61440个代码) 1110xxxx(E0-EF) 10yyyyyy 10zzzzzz 三个字节
* 010000 - 10FFFF(1048576个代码) 11110www(F0-F7) 10xxxxxx 10yyyyyy 10zzzzzz 四个字节
*
* 注: Unicode在范围 D800-DFFF 中不存在任何字符
* @see http://zh.wikipedia.org/wiki/UTF-8
*
* UTF-16 大部分使用两个字节编码,编码超出 65535 的使用四个字节
* 000000 - 00FFFF 两个字节
* 010000 - 10FFFF 四个字节
*
* @see http://zh.wikipedia.org/wiki/UTF-16
* @param {String} str
* @param {String} charset utf-8, utf-16
* @return {Number}
*/
export function charLength(str, charset) {
let total = 0
let charCode, i, len
charset = charset ? charset.toLowerCase() : ''
if (charset === 'utf-16' || charset === 'utf16') {
for (i = 0, len = str.length; i < len; i++) {
charCode = str.charCodeAt(i)
if (charCode <= 0xffff) {
total += 2
} else {
total += 4
}
}
} else {
for (i = 0, len = str.length; i < len; i++) {
charCode = str.charCodeAt(i)
if (charCode <= 0x007f) {
total += 1
} else if (charCode <= 0x07ff) {
total += 2
} else if (charCode <= 0xffff) {
total += 3
} else {
total += 4
}
}
}
return total
}
/**
*
* @param {String} str - a string that to be trim spaces at begin or end of the string.
* @returns {String} a string without spaces at begin or end of itself.
*/
export function trim(str) {
if (isUnset(str)) { // if str is undefined or null, return empty string
return ''
}
return (str + '').replace(/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g, '')
}
export function dashToCamel(dashStr) {
assert(isString(dashStr), `dashToCamel(dashStr): expect dashStr to be type of String, but got ${typeOf(dashStr)}`)
if (dashStr.indexOf('-') === -1) {
return dashStr
}
let camelStr = dashStr
camelStr = trim(camelStr)
// remove the dash at begin or end
camelStr = camelStr.replace(/^-|-$/g, '')
camelStr = camelStr.replace(/-(\w)/g, (m, w) => w.toUpperCase())
return camelStr
}
/**
*
* @param {Number|String} num - the number going to be padded
* @param {NUmber} [size] - the length of the return string after padding
* @returns {String} - the padded string
*/
export function padZero(num, size = 2) {
return _padStart(num, size, 0)
}