UNPKG

fonteditor-core

Version:

fonts (ttf, woff, woff2, eot, svg, otf) parse, write, transform, glyph adjust.

208 lines (183 loc) 5.08 kB
/** * @file ttf字符串相关函数 * @author mengke01(kekee000@gmail.com) * * references: * 1. svg2ttf @ github */ import unicodeName from '../enum/unicodeName'; import postName from '../enum/postName'; /** * 将unicode编码转换成js内部编码, * 有时候单子节的字符会编码成类似`\u0020`, 这里还原单字节 * * @param {string} str str字符串 * @return {string} 转换后字符串 */ function stringify(str) { if (!str) { return str; } let newStr = ''; for (let i = 0, l = str.length, ch; i < l; i++) { ch = str.charCodeAt(i); if (ch === 0) { continue; } newStr += String.fromCharCode(ch); } return newStr; } export default { stringify, /** * 将双字节编码字符转换成`\uxxxx`形式 * * @param {string} str str字符串 * @return {string} 转换后字符串 */ escape(str) { if (!str) { return str; } return String(str).replace(/[\uff-\uffff]/g, c => escape(c).replace('%', '\\')); }, /** * bytes to string * * @param {Array} bytes 字节数组 * @return {string} string */ getString(bytes) { let s = ''; for (let i = 0, l = bytes.length; i < l; i++) { s += String.fromCharCode(bytes[i]); } return s; }, /** * 获取unicode的名字值 * * @param {number} unicode unicode * @return {string} 名字 */ getUnicodeName(unicode) { const unicodeNameIndex = unicodeName[unicode]; if (undefined !== unicodeNameIndex) { return postName[unicodeNameIndex]; } return 'uni' + unicode.toString(16).toUpperCase(); }, /** * 转换成utf8的字节数组 * * @param {string} str 字符串 * @return {Array.<byte>} 字节数组 */ toUTF8Bytes(str) { str = stringify(str); const byteArray = []; for (let i = 0, l = str.length; i < l; i++) { if (str.charCodeAt(i) <= 0x7F) { byteArray.push(str.charCodeAt(i)); } else { const codePoint = str.codePointAt(i); if (codePoint > 0xffff) { i++; } const h = encodeURIComponent(String.fromCodePoint(codePoint)).slice(1).split('%'); for (let j = 0; j < h.length; j++) { byteArray.push(parseInt(h[j], 16)); } } } return byteArray; }, /** * 转换成usc2的字节数组 * * @param {string} str 字符串 * @return {Array.<byte>} 字节数组 */ toUCS2Bytes(str) { str = stringify(str); const byteArray = []; for (let i = 0, l = str.length, ch; i < l; i++) { ch = str.charCodeAt(i); byteArray.push(ch >> 8); byteArray.push(ch & 0xFF); } return byteArray; }, /** * 获取pascal string 字节数组 * * @param {string} str 字符串 * @return {Array.<byte>} byteArray byte数组 */ toPascalStringBytes(str) { const bytes = []; const length = str ? (str.length < 256 ? str.length : 255) : 0; bytes.push(length); for (let i = 0, l = str.length; i < l; i++) { const c = str.charCodeAt(i); // non-ASCII characters are substituted with '*' bytes.push(c < 128 ? c : 42); } return bytes; }, /** * utf8字节转字符串 * * @param {Array} bytes 字节 * @return {string} 字符串 */ getUTF8String(bytes) { let str = ''; for (let i = 0, l = bytes.length; i < l; i++) { if (bytes[i] < 0x7F) { str += String.fromCharCode(bytes[i]); } else { str += '%' + (256 + bytes[i]).toString(16).slice(1); } } return unescape(str); }, /** * ucs2字节转字符串 * * @param {Array} bytes 字节 * @return {string} 字符串 */ getUCS2String(bytes) { let str = ''; for (let i = 0, l = bytes.length; i < l; i += 2) { str += String.fromCharCode((bytes[i] << 8) + bytes[i + 1]); } return str; }, /** * 读取 pascal string * * @param {Array.<byte>} byteArray byte数组 * @return {Array.<string>} 读取后的字符串数组 */ getPascalString(byteArray) { const strArray = []; let i = 0; const l = byteArray.length; while (i < l) { let strLength = byteArray[i++]; let str = ''; while (strLength-- > 0 && i < l) { str += String.fromCharCode(byteArray[i++]); } // 这里需要将unicode转换成js编码 str = stringify(str); strArray.push(str); } return strArray; } };