当单个字符不等于一个字节时,有没有人对用户显示“超出最大长度”错误有好的建议?
我不知所措,但我找到a quote that's more eloquent:
如果缓冲区超过三个字节,你告诉用户什么?三个字节可以是用户需要修剪的一个,两个或三个字符。根据他们修剪的字符,结果可能仍然太长。并且回想一下,用户对“一个角色”的感知可能更接近一个字形或字形集群,而不是一个角色。所以他们可能会删除太多字符而没有意识到它。最后,如果缓冲区限制很小(如10或20),一些像中文这样的语言将严格限制允许的字符数。
我所承受的一些限制是它的表单驱动的网站和底层数据库列大小无法更改(引用页面建议使用40字节缓冲区并强制执行10个字符限制)。
答案 0 :(得分:4)
我最喜欢的解决此问题的方法是突出显示超出最大长度的输入部分。这提供了一个视觉提示,指示哪个部分使其“太长”,而不必详细了解它是多少字节或字符。
如果您可以使用Javascript(例如,如果您不需要满足508标准),我还喜欢监视字段的长度并在用户太长时提醒用户(同时仍在进行服务器端验证,当然)。
如果你不想进入输入字段中的复杂CSS,你可以只重现字段下方的错误输入并在那里突出显示它。
答案 1 :(得分:2)
明显的正确的答案是不限制文本长度。
但是如果你不能告诉用户他们必须玩多少个角色,那就不要了。当字符串太长时,只需告诉他们。跟踪当前字符串需要多少字节,如果超过限制,则为用户启用警告消息。
答案 2 :(得分:0)
大声思考......为什么不那么具体:“最大长度超过N”(例如“最大长度超过4”)。你不告诉用户最大长度是什么......只是它们是N超过它。并且你不告诉用户N代表什么(字节)...当他们看到消息“太长3”时...他们将删除至少3个字符(即使他们可以删除9个实际字节)。
我认为没有办法向用户解释为什么某些“字符”需要多个字节,这些字节很可能不会混淆它们。
答案 3 :(得分:0)
好问题。除了更改架构以使用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>