我正在尝试根据句子中字符数量进行一些动态编程。哪个英文字母在屏幕上占用的像素最多?
我正在尝试根据句子中字符数量进行一些动态编程。哪个英文字母在屏幕上占用的像素最多?
想知道真正最长的字形,不要只是瞎猜?
我说的不仅仅是字母、数字和常见符号(!、@等),而是UTF-16所有32,834个字符中最长的字形。
因此,我以@NK的答案为基础写了一个程序解决方案,并进行了修改:
var capsIndex = 65;
var smallIndex = 97;
var div = document.createElement('div');
div.style.float = 'left';
document.body.appendChild(div);
var highestWidth = 0;
var elem;
for(var i = capsIndex; i < 32834; i++) {
div.innerText = String.fromCharCode(i);
var computedWidth = window.getComputedStyle(div, null).getPropertyValue("width");
if(highestWidth < parseFloat(computedWidth)) {
highestWidth = parseFloat(computedWidth);
elem = String.fromCharCode(i);
}
}
div.innerHTML = '<b>' + elem + '</b>' + ' won';
运行此程序并等待(长时间等待),它将输出 ௌ won
。
这就是UTF-32中最长的字符!请注意,大多数字体中最长的字形是﷽,但某些字体(特别是等宽字体)会重叠字符,例如使用此程序运行的字体。
这将取决于字体。我会使用你最熟悉的编程语言创建一个小程序,在其中将字母表中的每个字母绘制成n乘m大小的位图。将每个像素初始化为白色。然后在绘制每个字母后计算白色像素的数量,并保存该数字。您找到的最高数字就是您要寻找的。
编辑:如果您实际上只对哪个占用最大矩形感兴趣(但看起来您真正想要的不是像素),则可以使用各种API调用来查找大小,但这取决于您的编程语言。例如,在Java中,您将使用FontMetrics类。
这段代码将以数组的形式获取所有字符的宽度:
const alphabet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
var widths = [];
var div = document.createElement('div');
div.style.float = 'left';
document.body.appendChild(div);
var highestObservedWidth = 0;
// widest characters (not just one)
var answer = '';
for (var i = 0; i < alphabet.length; i++) {
div.innerText = alphabet[i];
var computedWidthString = window.getComputedStyle(div, null).getPropertyValue("width");
var computedWidth = parseFloat(computedWidthString.slice(0, -2));
// console.log(typeof(computedWidth));
widths[i] = computedWidth;
if(highestObservedWidth == computedWidth) {
answer = answer + ', ' + div.innerText;
}
if(highestObservedWidth < computedWidth) {
highestObservedWidth = computedWidth;
answer = div.innerText;
}
}
if (answer.length == 1) {
div.innerHTML = ' Winner: ' + answer + '.';
} else {
div.innerHTML = ' Winners: ' + answer + '.';
}
div.innerHTML = div.innerHTML ;
// console.log(widths);
// console.log(widths.sort((a, b) => a - b));
或者,如果你想要一个宽度映射表,并包含除了上述描述的字母数字字符之外的更多字符(就像我在非浏览器环境中所需的那样)
const chars = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "!", "\"", "#", "$", "%", "'", "(", ")", "*", "+", ",", "-", ".", "/", ":", ";", "=", "?", "@", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z", "[", "\\", "]", "^", "_", "`", "a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "u", "v", "w", "x", "y", "z", "{", "|", "}", "~", " ", "&", ">", "<"]
const test = document.createElement('div')
test.id = "Test"
document.body.appendChild(test)
test.style.fontSize = 12
const result = {}
chars.forEach(char => {
let newStr = ""
for (let i = 0; i < 10; i++) {
if (char === " ") {
newStr += " "
} else {
newStr += char
}
}
test.innerHTML = newStr
const width = (test.clientWidth)
result[char] = width / 10
})
console.log('RESULT:', result)
#Test
{
position: absolute;
/* visibility: hidden; */
height: auto;
width: auto;
white-space: nowrap; /* Thanks to Herb Caudill comment */
}
这取决于字体。例如,交叉的零比普通的零占用更多的空间。
但如果要猜的话,我会选择X或B。