如何解决所有可能的可打印字符
对于图形项目,我需要一个字母字母,因此这些字符必须是“可打印的”,特别是在canvas
元素中(我需要执行ctx.fillText(char,...)
)。
目前我正在做
const alphabeth = [
'A','B','C','D','E','F','G','H','I','L','M','N','O','P','Q','R','S','T','U','V','Z','a','b','c','d','e','f','g','h','i','l','m','n','o','p','q','r','s','t','u','v','z','1','2','3','4','5','6','7','8','9','-','+','@','?','^','!','(',')','&','#','%','$','|','<','>'
];
但是这仅限于我手动插入的字符...有没有办法获取所有可打印字符? (或存在这些列表)
解决方法
DOMString是UTF-16编码的字符串。 JavaScript使用UCS-2对内部字符串进行编码。
有关在UCS-2和UTF-16代码点之间进行转换的信息,请参见此answer。建议的库为Punycode。
您可以使用正则表达式删除不可打印的字符as seen here。只需建立您的范围。除了制作正则表达式外,您还可以映射所有范围并在实际编码值之前按十六进制值进行过滤。形成范围时,可以使用字母数字或Unicode数字。
const CharClassRanges = [
'0-9',// Numeric
'a-z',// Latin
'α-ω',// Greek
'一-龯',// Japanese -- https://gist.github.com/terrancesnyder/1345094
'\uFB1D-\uFB4F',// Hebrew (a few in range are unprintable)
'!"#$%&\'()*+,.\/:;<=>?@\\[\\] ^_`{|}~-' // Special charcters
];
const PrintableUnicode = new RegExp(`^[${CharClassRanges.join('')}]*$`,'i');
console.log(PrintableUnicode)
/**
* Generate a range of UTF-16 Unicode values from 0xFEFF0000 to 0xFEFFFFFF.
* @see http://www.fileformat.info/info/charset/UTF-16/list.htm
*/
function* generatePrintableUTF16() {
const result = [];
for (let i = 0x0000; i < 0xFFFF; i++) {
const value = punycode.ucs2.encode([i]);
if (PrintableUnicode.test(value)) {
yield value;
}
}
};
console.log([...generatePrintableUTF16()].join('\n')); // Scroll to see all
.as-console-wrapper { top: 0; max-height: 100% !important; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/punycode/1.4.1/punycode.min.js"></script>
下面的示例生成约65,535个Unicode字符。我们只是说您真的不需要 来验证通话中的文本。
/**
* Generate a range of UTF-16 Unicode values from 0xFEFF0000 to 0xFEFFFFFF.
* @see http://www.fileformat.info/info/charset/UTF-16/list.htm
*/
const generateUTF16 = () => {
const result = [];
for (let i = 0x0000; i < 0xFFFF; i++) {
result.push(punycode.ucs2.encode([i]));
}
return result;
};
console.log(generateUTF16().join('\n')); // Scroll to see all
.as-console-wrapper { top: 0; max-height: 100% !important; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/punycode/1.4.1/punycode.min.js"></script>
主要的拉丁字符在(0xFEFF0021和0xFEFF007E)之间。
/**
* Generate a range of UTF-16 Unicode values from 0xFEFF0000 to 0xFEFFFFFF.
* @see http://www.fileformat.info/info/charset/UTF-16/list.htm
*/
const generateLatinUTF16 = () => {
const result = [];
for (let i = 0x21; i < 0x7F; i++) {
result.push(punycode.ucs2.encode([i]));
}
return result;
};
console.log(generateLatinUTF16().join('\n')); // Scroll to see all
.as-console-wrapper { top: 0; max-height: 100% !important; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/punycode/1.4.1/punycode.min.js"></script>
,
假设您希望从ascii表中找到所有角色,可以这样做:
编辑: 我有一个不可打印的黑名单或漫画人物
let caracters = []
let ban= [0,9,12,13,32] // ban list of caracters that are not printable
for(let i=0; i<127; i++ ){
let temp = false
ban.map(item=>{
if(i == item){
temp = true
}
})
if(!temp){
caracters.push(String.fromCharCode(i))
}
}
console.log(caracters)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。