dirname提交的字段名由name值加“.dir”构成(如name="query"→"query.dir"),值由首个强方向unicode字符(阿拉伯/希伯来字母→"rtl",其余→"ltr")自动推断生成,不依赖输入法或dir属性。

dirname 属性不能自动调整后端存储格式,它只负责在提交时多塞一个 xxx.dir 字段,且该字段值不可控、不实时、不兼容 Safari/iOS 和 Firefox。
dirname 提交的字段名和值怎么生成?
必须同时满足三个条件,dirname 才会生效:
-
name属性存在且非空(例如name="query") -
dirname的值严格等于"query.dir"(即name值 +".dir") - 用户输入的第一个强方向 Unicode 字符是阿拉伯字母(
\u0600–\u06FF)或希伯来字母(\u0590–\u05FF),否则一律推断为ltr
开头是中文、日文、空格、换行、逗号、句号等“弱方向”或中性字符,dirname 仍返回 ltr —— 它不是按输入法、dir 属性或光标位置判断的。
服务端如何安全读取 dirname 字段?
后端不能直接信任 req.body.query.dir 这种点号写法(JS 对象非法),也绝不能假设该字段一定存在:
- Node.js/Express:需启用
urlencoded({ extended: true }),再用req.body["query.dir"]获取 - Python/Flask:
request.form.get("query.dir"),并始终 fallback 到首字符 Unicode 范围检测 - PHP:
$_POST["query.dir"] ?? null,同样要检查mb_ord($input[0])是否落在 RTL 区间
Firefox 完全不发送该字段;iOS Safari(含 17.5)至今未支持;旧版 iOS Safari(15.4 前)有 bug,软键盘弹出后恒返回 ltr。这意味着你必须把 dirname 当作辅助信号,而非唯一依据。
dirname 和 dir 属性根本不是一回事
常见错误是以为加了 dirname="msg.dir" 就能让阿拉伯文右对齐、光标从右开始——完全不会。它对渲染、光标、换行、Tab 流向零影响:
-
dir="auto"或dir="rtl"控制显示与交互行为 -
dirname只在表单 submit 瞬间往 POST 数据里多加一个字段 - 两者可共存(如
<input name="msg" dir="auto" dirname="msg.dir">),但逻辑完全解耦
真正需要适配 RTL 内容,得靠 dir 控制前端渲染,靠服务端结合首字符、Accept-Language、甚至用户偏好设置做综合判断——dirname 提供的只是一个脆弱、延迟、不可靠的额外线索。











