两类不同的转换
页面上的转换分为两类。第一类是直接改变字母大小写(UPPERCASE、lowercase、Title Case、Sentence case、tOGGLE cASE), 标点和换行原样保留,只改字母的大小。第二类是先拆成单词再拼成一个标识符(camelCase、PascalCase、snake_case、 CONSTANT_CASE、kebab-case、dot.case),空格、下划线、连字符、点号等都被视为单词边界,再按新规则重新连接。因此 “user profile image URL”转成 camelCase 是 userProfileImageUrl,再把这个结果转成 kebab-case 则得到user-profile-image-url。无论出发点是哪种写法,只要包含的单词相同,结果就相同,这是第二类转换的好处。
单词边界是怎么找的
标识符转换的质量取决于“在哪里断开”。本工具按下面的顺序寻找边界。
- 小写字母或数字后面紧跟大写字母时,在两者之间断开(userName → user Name,getUserID → get User ID)。
- 连续大写字母之后接“大写+小写”时,在最后一个大写字母之前断开(HTMLParser → HTML Parser,XMLHttpRequest → XML Http Request)。
- 所有不是字母或数字的字符(空格、_、-、.、斜杠、括号等)都当作分隔符并丢弃。
第二条规则避免了缩写被逐个字母拆散。下表是用示例输入运行实际转换函数得到的结果,每一行都出自同一组单词, 因此可以横向比较各列。
| 输入 | camelCase | PascalCase | snake_case | CONSTANT_CASE | kebab-case | dot.case |
|---|---|---|---|---|---|---|
| user profile image URL | userProfileImageUrl | UserProfileImageUrl | user_profile_image_url | USER_PROFILE_IMAGE_URL | user-profile-image-url | user.profile.image.url |
| HTMLParser | htmlParser | HtmlParser | html_parser | HTML_PARSER | html-parser | html.parser |
| getUserID2 | getUserId2 | GetUserId2 | get_user_id2 | GET_USER_ID2 | get-user-id2 | get.user.id2 |
| order-total_price | orderTotalPrice | OrderTotalPrice | order_total_price | ORDER_TOTAL_PRICE | order-total-price | order.total.price |
| XMLHttpRequest | xmlHttpRequest | XmlHttpRequest | xml_http_request | XML_HTTP_REQUEST | xml-http-request | xml.http.request |
如“getUserID2”所示,数字会和前面的字母粘在一起(“ID2”是一个整体)。若想在字母和数字之间也断开,请在转换前的输入里加一个空格。 另外有个限制:本工具没有词典,所以像“newyork”这种全小写连在一起的词无法拆成两个。必须有空格、分隔符或大小写变化这类提示才行。
不同格式用在哪里
命名格式不是个人喜好,而是各语言和工具的约定。违反约定通常不影响运行,但会在代码评审和 lint 中被指出,个别环境下还会真的出问题。
- camelCase:JavaScript、TypeScript、Java、Swift 等语言的变量、函数、方法名,JSON 的键名里也很常见。
- PascalCase:类、类型、React 或 Astro 等的组件名,C# 的方法名。在 Go 中,首字母大写意味着可被包外访问。
- snake_case:Python(PEP 8)和 Rust 的函数与变量,以及许多数据库的表名、列名。
- CONSTANT_CASE(UPPER_SNAKE_CASE):常量和环境变量,如
DATABASE_URL。 - kebab-case:URL 路径、CSS 类名和自定义属性、HTML 属性、文件名。多数编程语言会把连字符当作减号,所以不能用于标识符。
- dot.case:配置键(
server.port)、包或命名空间路径、日志事件名。 - Title Case / Sentence case:标题、菜单与按钮文字、普通句子,规则见下一节。
Title Case 与 Sentence case 的实际规则
Title Case 把每个单词的首字母大写,但按惯例冠词(a、an、the)、并列连词(and、but、or)和短介词(of、in、on、at、to、by、for)保持小写, 首尾单词则一律大写。勾选“小词保持小写”后,除首尾位置外,列表中的词(a、an、the、and、but、or、nor、for、so、yet、of、in、on、at、to、by、up、as)保持小写; 取消勾选则所有单词都以大写开头。AP、APA、Chicago、MLA 等风格指南在“四个字母以上的介词是否大写”等细节上并不一致, 没有哪个工具能同时满足,提交给出版社或期刊的标题请对照其规定。
Sentence case 只把每句话的第一个字母大写,其余变小写;句号、问号、感叹号之后的空白以及新的一行都算句首。需要注意专有名词和缩写也会被小写: “Paris is in FRANCE.”会变成“Paris is in france.”,转换后请自己改回 France、NASA、iPhone 等。
验算过的转换示例
示例 1:“user profile image URL”有 3 个空格,拆成 4 个单词(user、profile、image、URL)。snake_case 把它们全部小写并用下划线连接, 得到 user_profile_image_url;CONSTANT_CASE 则是 USER_PROFILE_IMAGE_URL。
示例 2:“HTMLParser”按规则 2 拆成“HTML”和“Parser”。snake_case 是 html_parser,kebab-case 是 html-parser, camelCase 是 htmlParser,符合“开头的缩写整体小写”的通用习惯。如果只找“小写接大写”的简单转换器,结果会是“htmlparser”。
Unicode 大小写并不总是简单的
人们容易以为大写一个字母就得到一个字母、再转小写就能还原,但在英语以外这个假设并不成立。本工具使用浏览器内置的toUpperCase() 与 toLowerCase(),遵循 Unicode 的默认(与语言无关的)映射。下表是实际运行这些方法得到的结果。
| 输入 | 方法 | 结果 | 说明 |
|---|---|---|---|
| straße | toUpperCase() | STRASSE | 德语的 ß 转大写后变成两个字母 SS,文本会变长。 |
| İstanbul | toLowerCase() | i̇stanbul | 土耳其语带点的大写 İ 转小写后,变成 i 加一个组合用的点符号。 |
| istanbul | toUpperCase() | ISTANBUL | 不使用土耳其语规则时会变成普通的 I;土耳其语的正确写法是 İSTANBUL。 |
| ISPARTA | toLowerCase() | isparta | 不使用土耳其语规则时会变成 i;土耳其语应为不带点的 ı(ısparta)。 |
| ΣΑΣ | toLowerCase() | σας | 希腊语大写 Σ 在词尾变成 ς,其余位置变成 σ,结果取决于上下文。 |
土耳其语和阿塞拜疆语是经典的陷阱:它们同时有带点的 i 和不带点的 ı,因此“I”和“i”并不互为大小写。要处理好需要指定语言的函数, 比如 toLocaleUpperCase('tr'),本页面没有调用,土耳其语文本请人工核对。汉字、日文假名、韩文、数字和符号本来就没有大小写之分, 会原样保留,所以中英混排的句子做大写转换时只有英文字母会变。命名格式会把中文按空格或符号拆开再连接(例如“会员 信息 修改”→ 会员_信息_修改), 但标识符能否使用中文取决于编程语言和团队规范,使用前请确认。
一次转换多行
常见的需求是把二十个列名一次转成 snake_case。勾选“命名格式按行分别转换”后,每行被当作独立的标识符,行数保持不变;取消勾选则整段文本合并成一个标识符, 换行也会被当作分隔符消失。UPPERCASE、lowercase、Title Case、Sentence case 与 tOGGLE cASE 始终保留换行和标点。
常见误区
- 以为转换可以还原:把“XMLHttpRequest”转成 snake_case 得到“xml_http_request”,再转回 camelCase 是“xmlHttpRequest”,缩写的大写没有恢复。请另外保存原文。
- 批量改完接口字段或数据库列名就直接上线:改 JSON 键名或列名会影响服务端、客户端和所有查询,绝不只是改个名字,请先确认兼容性。
- URL 里使用 snake_case:URL 中通常用连字符分隔单词,关于可读 URL 的建议也大多以此为前提,所以 kebab-case 更稳妥。
- 指望 Title Case 一键完成标题:它只套用通用规则,不能识别 eBay、iPhone 等品牌写法,也可能与你遵循的风格指南不一致。
不适合使用本工具的情况
要在整个代码库中重命名标识符并同步所有引用处,需要用编辑器的“重命名符号”功能。本页只改文本,不理解代码含义, 也不能自动识别专有名词或检查语法。
转换之后
转换好的清单可以用字数统计核对数量,用文本对比逐行查看改动前后的差异。要批量查找并替换名称,可先在正则表达式测试器里用示例文本试验; 若转换后的名称要放进 JSON,可用 JSON 格式化检查语法。
常见问题
中文或日文文本也能转换吗?
只有拉丁、希腊、西里尔等文字有大小写之分。中文、日文、韩文文本点大小写按钮不会有任何变化。camelCase、snake_case 等是按空格和符号拆分后连接,任何文字都能运行,但它们本是为英文代码命名设计的。
我输入的文本会被保存吗?
不会。所有转换都在浏览器内完成,文本不会发送到服务器。
camelCase 和 PascalCase 有什么区别?
两者都不使用分隔符、每个单词首字母大写,区别只在第一个字母:camelCase 以小写开头(userName),PascalCase 以大写开头(UserName)。许多语言用 camelCase 命名变量和函数,用 PascalCase 命名类、类型和组件。
为什么 HTMLParser 变成 html_parser 而不是 h_t_m_l_parser?
连续大写字母后面接“大写+小写”时,工具会在最后那个大写字母之前断开(这里是 L 与 P 之间),因此 HTML 被当作一个词,得到 html_parser 和 html-parser 这样自然的结果。
数字是怎么处理的?
数字与相邻字母保持为一个整体。“version2 update”在 snake_case 下是“version2_update”。若想把数字单独分开,请先在输入中加空格。
换行或标点消失了怎么办?
命名格式会把所有非字母数字字符当作分隔符,所以这是正常现象。想保留行数请勾选“命名格式按行分别转换”;想保留标点请使用 UPPERCASE、lowercase、Title Case 或 Sentence case。