信用卡验证:卡名可以包含非 ASCII 字符吗?

Posted

技术标签:

【中文标题】信用卡验证:卡名可以包含非 ASCII 字符吗?【英文标题】:Credit Card validation: can Card Name contain non-ASCII characters? 【发布时间】:2011-01-01 13:12:01 【问题描述】:

卡名(即持卡人姓名,而不是卡类型)可以包含非 ASCII 字符吗? 示例:“何塞·冈萨雷斯”。

【问题讨论】:

【参考方案1】:

芯片卡(又名智能卡、EMV 卡)包含并可以返回大量不同的值,包括“持卡人姓名”(标签 5F20)和“扩展持卡人姓名”(标签 9F0B)。 EMV Co. 表示这两个标签都应遵循 ISO 7813,但我已经看到一张卡片(来自大韩航空的“NH 卡”),其中标签 5F20 包含小写字符。潘多拉的盒子被打开了!

【讨论】:

【参考方案2】:

磁条甚至可以存储标点符号! " * # % & ( ) ^ : ; = ? [ / ] _ 但实际上持卡人姓名仅使用:

英文大写字母的范围 撇号 (') 表示“Gareth O'Hare”等名称 减号 (-) 表示“Alexandru-Cristian”等双重名称 点 (.) 表示尊敬的前缀,例如“MR.”、“MRS.”、“MISS.”、“MS.”、“DR.”、“THE.” 点 (.) 表示“Jimmy L. Morgan”、“J.P. Teron”等首字母

【讨论】:

【参考方案3】:

使用的字符集不允许允许使用变音符号。简而言之,它只允许大写 ASCII 字符。

限制最终来自银行卡将数据编码到磁条上的历史方式(as defined in ISO 7811)。数据以每个字符 7 位的格式编码,称为 ITU-T.50

持卡人姓名最多由 26 个字符编码,每个字符的范围为十六进制 20-5F。您可以在此处查看此表:http://www.zytrax.com/tech/ia5.html

【讨论】:

根据该链接,它不是 ASCII,而是“ANSI/ISO ALPHA”,它看起来像是从 0x20 到 0x5F 映射到 0x00...0x3F 的 ASCII 子集,并添加了一个奇校验位结束。这些数字看起来像从 0x30 到 0x3F 的 ASCII 映射到 0x0...0xF,并在末尾添加了一个奇校验位。所以甚至没有小写字母,更不用说高位 ASCII 或任何潜在的 UTF-8 支持了。 是的,看起来并没有太严格(我的应用程序目前只允许可打印的 ASCII 字符),实际上我太宽容了!但是,如果我开始拒绝小写字母,我敢肯定用户会很生气,所以我可能会保留它。我主要担心的是我拒绝了合法卡,所以我松了一口气,事实并非如此。 我想你不明白。没有办法用信用卡磁条上的编码来表示小写字母。他们甚至不在字符集中。 我明白。我的意思是从可用性的角度来看,如果卡名被拒绝,用户会感到沮丧,因为他们输入的是小写字母。因此,我将所有小写字母转换为大写。 公平地说,卡名几乎对所有付款都无用,唯一的例外是在用卡支付机票或汽车租赁时(为此会捕获数据以供以后进行犯罪调查) .几乎每次我被问到卡片上印有我的名字时,我都会输入类似“Mr Silly McDuff”之类的内容。【参考方案4】:

确实,只允许使用 ASCII 字符。但允许其他操作。可以在第一行或第二行打印名称。可以选择带点或不带点等。

因此,您不能让客户对变音符号感到满意(想想挪威和德国的名字)。但是您可以让客户在只有一个字符的完整名字之间进行选择(例如 JOSE GONZALES 或 J. GONZALES)。它有助于让客户满意。

【讨论】:

【参考方案5】:

我过去使用的信用卡处理器只允许在持卡人姓名中使用 ASCII,但您应该咨询您的信用卡处理器以了解他们的要求/限制。

【讨论】:

FWIW,在 Google 图片搜索中查找“jcb 卡”(日本信用卡)会显示带有 ASCII 持卡人姓名的卡。如果即使日本信用卡也只使用 ASCII,那么这种限制似乎是普遍存在的。

以上是关于信用卡验证:卡名可以包含非 ASCII 字符吗?的主要内容,如果未能解决你的问题,请参考以下文章

防止在文本框中输入非 ascii 字符

Python:将包含非 ASCII 字符的列表写入文本文件

您的 SDK 位置包含非 ASCII 字符 - 工具菜单中没有 Android

如何在 Linux 中打开包含非 Ascii 字符串的 wchar_t* 文件?

Django:非ASCII字符

控制字符是啥