“最佳显示方式”;“输入太长”;unicode输入错误?

“最佳显示方式”;“输入太长”;unicode输入错误?,unicode,error-handling,Unicode,Error Handling,当单个字符不等于一个字节时,是否有人对向用户显示“超出最大长度”错误有好的建议 我不知所措,但我发现: 如果缓冲区超过三个字节,你会告诉用户什么?三个字节可以是用户需要修剪的一个、两个或三个字符。根据修剪的字符,结果可能仍然太长。回想一下,用户对“角色”的感知可能更接近于字形或字形簇,而不是角色。因此,他们可能会在不知不觉中删除太多字符。最后,如果缓冲区限制很小(如10或20),一些语言(如中文)将严格限制允许的字符数 我面临的两个限制是,它是一个表单驱动的网站,底层数据库列的大小不能更改(引用

当单个字符不等于一个字节时,是否有人对向用户显示“超出最大长度”错误有好的建议

我不知所措,但我发现:

如果缓冲区超过三个字节,你会告诉用户什么?三个字节可以是用户需要修剪的一个、两个或三个字符。根据修剪的字符,结果可能仍然太长。回想一下,用户对“角色”的感知可能更接近于字形或字形簇,而不是角色。因此,他们可能会在不知不觉中删除太多字符。最后,如果缓冲区限制很小(如10或20),一些语言(如中文)将严格限制允许的字符数

我面临的两个限制是,它是一个表单驱动的网站,底层数据库列的大小不能更改(引用页面建议使用40字节的缓冲区并强制执行10个字符的限制)。

显然正确的答案是不限制文本长度


但是如果你不能告诉用户他们要玩多少个角色,就不要。当字符串太长时,简单地告诉他们。跟踪当前字符串所需的字节数,如果超出您的限制,则为用户启用警告消息。

我最喜欢的解决此问题的方法是,突出显示输入中超过最大长度的部分。这提供了一个视觉提示,说明哪些部分使其“过长”,不必详细说明它有多少字节或字符

如果您可以使用Javascript(例如,如果您不需要满足508标准),我还喜欢监视字段的长度,并在字段太长时提醒用户(当然,仍然在进行服务器端验证)


如果您不想在输入字段中使用复杂的CSS,您可以在字段下面复制错误的输入,并在那里突出显示。

只需大声思考。。。为什么不具体一点:“最大长度超过N”(例如,“最大长度超过4”)。您不会告诉用户最大长度是多少。。。只是因为他们不在乎。并且您不告诉用户N代表什么(字节)。。。当他们看到信息“太长了3”。。。它们将删除至少3个字符(即使它们可能删除9个实际字节)


我想没有办法向用户解释为什么某些“字符”需要多个字节,而这些字节很有可能不会混淆它们

好问题。除了将模式更改为使用Unicode字符而不是字节之外,不确定是否有好的答案。例如,在具有NVARCHAR的SQL Server或具有UTF-8排序规则的MySQL中,列受到字符长度的限制。当然,这有点像“列长度不能改变”,即使它们在技术上是相同的“长度”

值得一提的是,东亚用户将习惯于一个字符不是一个字节的想法,因为长期以来,“半宽”拉丁字符占据的存储空间和屏幕空间是汉字的一半

不过,一般来说,你不能指望任何人都能找到UTF-8字节数。也许在客户端,您可以使用“使用量”栏而不是字节数,以纯粹的视觉方式进行操作:

<style type="text/css">
    .field { width: 12em; }
    .field input { width: 100%; }
    .field input { box-sizing: border-box; -moz-box-sizing: border-box; -ms-box-sizing: border-box; -webkit-box-sizing: border-box; -khtml-box-sizing: border-box; }
    .indicator { background: blue; height: 5px; }
    .indicator-over { background: red; height: 5px; }
</style>

<div class="field">
    <input type="text" name="pwd" class="limited-12">
</div>

<script type="text/javascript">
    function limitInput(element, limit) {
        var indicator= document.createElement('div');
        element.parentNode.insertBefore(indicator, element.nextSibling);
        element.onchange=element.onkeyup= function() {
            var utf8= unescape(encodeURIComponent(element.value));
            indicator.className= utf8.length>limit? 'indicator-over' : 'indicator';
            var used= Math.min(utf8.length/limit, 1);
            indicator.style.width= Math.floor(used*100)+'%';
        }
        element.onchange();
    }

    var inputs= document.getElementsByTagName('input');
    for (var i= inputs.length; i-->0;)
        if (inputs[i].className.substring(0, 8)=='limited-')
            limitInput(inputs[i], parseInt(inputs[i].className.substring(8)));
</script>

.field{width:12em;}
.字段输入{宽度:100%;}
.field输入{框大小:边框框;-moz框大小:边框框;-ms框大小:边框框;-webkit框大小:边框框;-khtml框大小:边框框;}
.指示器{背景:蓝色;高度:5px;}
.指示器位于{背景:红色;高度:5px;}
功能限制输入(元素、限制){
var indicator=document.createElement('div');
element.parentNode.insertBefore(指示符,element.nextSibling);
element.onchange=element.onkeyup=function(){
var utf8=unescape(encodeURIComponent(element.value));
indicator.className=utf8.length>limit?'indicator over':'indicator';
使用的变量=数学最小值(utf8.length/limit,1);
indicator.style.width=Math.floor(使用*100)+'%';
}
元素onchange();
}
var inputs=document.getElementsByTagName('input');
对于(变量i=inputs.length;i-->0;)
if(输入[i].className.substring(0,8)='limited-')
limitInput(输入[i],parseInt(输入[i].className.substring(8));

好吧,您提到的示例只是JavaScript。这对于更高级的用户体验来说没什么,但真正的检查应该在服务器端完成。你用什么语言编码?