javascript - 当文本可以包含非拉丁字母时如何计算字符长度

标签 javascript unicode

我有以等宽字体显示 ASCII 表的功能

        function ascii_table(array, header) {
            if (!array.length) {
                return '';
            }

            for (var i = array.length - 1; i >= 0; i--) {
                var row = array[i];
                var stacks = [];
                for (var j = 0; j < row.length; j++) {
                    var new_lines = row[j].toString().split("\n");
                    row[j] = new_lines.shift();
                    stacks.push(new_lines);
                }
                var new_rows_count = Math.max.apply(Math, stacks.map(function(column) {
                    return column.length;
                }));
                for (var k = new_rows_count - 1; k >= 0; k--) {
                    array.splice(i + 1, 0, stacks.map(function(column) {
                        return column[k] || "";
                    }));
                }
            }

            var lengths = array[0].map(function(_, i) {
                var col = array.map(function(row) {
                    if (row[i] != undefined) {
                        return row[i].length;
                    } else {
                        return 0;
                    }
                });
                return Math.max.apply(Math, col);
            });
            // column padding
            array = array.map(function(row) {
                return '| ' + row.map(function(item, i) {
                    var size = item.length;
                    if (size < lengths[i]) {
                        if (item.match(/\t/g)) {
                            // tab have 4 spaces
                            size += item.match(/\t/g).length*3;
                        }
                        item += new Array(lengths[i] - size + 1).join(' ');
                    }
                    return item;
                }).join(' | ') + ' |';
            });
            var sep = '+' + lengths.map(function(length) {
                return new Array(length + 3).join('-');
            }).join('+') + '+';
            if (header) {
                return sep + '\n' + array[0] + '\n' + sep + '\n' +
                    array.slice(1).join('\n') + '\n' + sep;
            } else {
                return sep + '\n' + array.join('\n') + '\n' + sep;
            }
        }

但如果表格单元格包含日文字母,例如 中文,且一个字符的宽度为两个 ASCII 字母,则会失败:

中文
rock

遇到这样的情况我该如何处理?我如何知道字符的宽度是否为 2?

最佳答案

您需要检查字符宽度而不是长度。任何(体面的)portwcwidth应该可以解决问题。

关于javascript - 当文本可以包含非拉丁字母时如何计算字符长度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40868370/

相关文章:

javascript - Chrome 调试器不适用于 typescript 文件

ios - 格式化 NSString 以保存 ascii 值而不是 unicode 字符

python - 如何指定一系列 unicode 字符

unicode - 以重音字符为键的 Common Lisp 哈希表

MySQL 不区分大小写但区分重音 UTF8 唯一键

javascript - 将 ES6 Map 与 React 和/或 Redux 一起使用

javascript - 在 AngularJS 中从数组中获取对象的正确方法

android - 如何在android中获取字符的Unicode

javascript - 是否有 JavaScript/jQuery 文件创建事件?

javascript - 悬停时我的 h1 标签链接出现下划线,我没有添加