API 字段名统一
后端返回的字段是 snake_case(user_name),前端团队用的却是 camelCase(userName)。联调时因为命名不一致,接口对接反复报错。用本工具将整段 JSON 的 key 批量转为驼峰,前后端各拿一份对照表,半小时的对齐工作压缩到 5 分钟,且不会漏改某个深层嵌套字段。
文本工具 · 大小写 / 全角半角
全大/全小/首字母/句首/驼峰/蛇形/短横
一份英文文档里,标题全大写,正文句首大写,变量名用驼峰——手动改一遍,眼睛累、手更累。把文本粘贴进来,选一种转换规则(全大写、全小写、首字母大写、句首大写、驼峰式、蛇形式、短横式),结果即时预览。所有处理在浏览器本地完成,文字不会被上传到任何服务器。
后端返回的字段是 snake_case(user_name),前端团队用的却是 camelCase(userName)。联调时因为命名不一致,接口对接反复报错。用本工具将整段 JSON 的 key 批量转为驼峰,前后端各拿一份对照表,半小时的对齐工作压缩到 5 分钟,且不会漏改某个深层嵌套字段。
从 Excel 导出的用户名单里,姓名列全是全大写(ZHANG SAN),但公司 CRM 系统要求首字母大写(Zhang San)。手动改 3000 条记录至少半天,还容易漏改中间名。把整列粘贴进工具,选「首字母大写」模式,3 秒出结果,直接覆盖原列导入,零遗漏。
团队 Git 提交信息风格不统一:有人写全小写(fix bug),有人写句首大写(Fix bug),还有人写驼峰(fixBug)。Code Review 时每次都要口头提醒。把最近 20 条 commit message 粘贴进工具,统一转为「句首大写」格式,再复制回终端批量 amend,后续 CI 检查规则也按这个标准写。
参考文献管理软件导出的条目全是全大写(AUTHOR, T.),但目标期刊要求首字母大写(Author, T.)。手动改 80 条参考文献,每条标题里还有大小写混用的专有名词。用本工具先统一转为首字母大写,再手动修正少数专有名词(如 RNA),比逐条重敲节省了 40 分钟。
爬取电商商品列表时,同一个 SKU 在不同页面出现「Nike Air Max」和「NIKE AIR MAX」两种写法,导致去重失败。把 5000 条标题全转为小写后做哈希去重,再转回原始格式保留展示。本工具支持批量处理,不用写 Python 脚本,非技术运营也能直接操作。
接手一个老项目,代码里变量名全是蛇形(user_list),但新团队规范要求短横线(user-list)用于 CSS 类名。全局搜索替换容易误伤注释里的内容。用本工具把变量定义行单独抽出来转换,再对照结果手动替换,比写正则表达式快且不出错。
| 维度 | 本工具 | 竞品 A(在线转换站) | 传统方法(手动操作) |
|---|---|---|---|
| 转换类型 | 全大/全小/首字母/句首/驼峰/蛇形/短横共 7 种 | 通常只支持全大/全小/首字母大写 3 种 | 只能靠肉眼逐个修改,或手动输入公式/替换 |
| 隐私 | 纯浏览器处理,文本不上传服务器 | 文本需粘贴到网页后上传至服务端处理 | 完全本地,但需自行编辑文件 |
| 速度 | 毫秒级实时转换,输入即出结果 | 依赖网络延迟,通常 1-3 秒 | 取决于文本长度和手动操作熟练度,分钟级 |
| 批量处理 | 支持单次粘贴任意长度文本,一次性转换 | 部分站点限制单次 5000 字符,长文本需分段 | 无法批量,只能逐字或逐行修改 |
| 离线可用 | 完全离线,浏览器打开后断网仍可用 | 必须联网,断网无法使用 | 无需网络,但依赖本地编辑器 |
| 费用 | 免费,无隐藏收费 | 部分站点免费但含广告,高级功能需付费会员 | 免费,但需自行投入时间成本 |
| 输入 | 输出 | 说明 |
|---|---|---|
| hello world | HELLO WORLD | 常规:全大写转换,验证基本空格和字母处理 |
| hello world | Hello World | 常规:首字母大写(每个单词首字母大写),验证空格分隔单词的处理 |
| hello world | helloWorld | 常规:驼峰式转换,验证空格去除及首单词小写、后续单词首字母大写的规则 |
| hello world | hello_world | 常规:蛇形式转换,验证空格替换为下划线且全部小写 |
| hello world | hello-world | 常规:短横式转换,验证空格替换为短横且全部小写 |
| HELLO WORLD | hello world | 边界:全大写输入转全小写,验证大写字母到小写的正确映射 |
| hello world | Hello world | 边界:句首大写(仅首单词首字母大写),验证只改变第一个单词的首字母,其余保持原样 |
| 123abc!@# | 123ABC!@# | 易错:含数字和特殊字符,验证非字母字符是否被忽略或保留原样(全大写转换) |
1.首字母大写误用于全大写单词
输入 "APPLE",选首字母大写,期望 "APPLE" 不变输入 "apple",选首字母大写,得到 "Apple"首字母大写只将每个单词的首字母转为大写、其余保持原样。全大写字符串中的非首字母不会自动小写,结果仍是 "APPLE"。
2.句首大写误以为会处理句号后的单词
输入 "hello.world",选句首大写,期望得到 "Hello.World"输入 "hello world",选句首大写,得到 "Hello world"句首大写仅将字符串的第一个字母转为大写,不识别句号、换行等分隔符后的单词。后续单词需手动处理或配合其他转换。
3.驼峰转换时混淆了大小驼峰
输入 "get user id",选驼峰,期望 "getUserId",实际得到 "GetUserId"输入 "get user id",选驼峰,得到 "GetUserId"(大驼峰);若需小驼峰,应选首字母小写后再转本工具驼峰默认输出大驼峰(PascalCase),首字母大写。小驼峰(camelCase)需先转全小写再手动首字母小写,或工具若提供选项则选小驼峰。
4.蛇形转换时误保留原有分隔符
输入 "user_name",选蛇形,期望 "user_name" 不变,实际得到 "user_name"(正确)但若输入 "user-name" 则得到 "user_name"输入 "user-name",选蛇形,得到 "user_name"蛇形转换将空格、连字符、下划线等分隔符统一替换为下划线。若输入已含下划线,结果不变;若输入含其他分隔符,会被替换。
5.短横转换时忽略数字与字母混合
输入 "CSS3Property",选短横,期望 "css3-property",实际得到 "css-3-property"输入 "CSS3Property",选短横,得到 "css3-property"短横转换(kebab-case)通常只在字母大小写边界或单词分隔处插入连字符。数字与字母之间是否插入连字符取决于实现,本工具在数字与字母交界处不插入连字符。
6.全小写转换后误以为会保留专有名词大小写
输入 "iPhone",选全小写,期望 "iPhone" 不变输入 "iPhone",选全小写,得到 "iphone"全小写转换无条件将所有字母转为小写,不识别专有名词、品牌名等。如需保留特定大写,需手动调整。
SnakeCase = 原字符串.replace(/[A-Z]/g, '_$&').replace(/[\s-]+/g, '_').replace(/^_/, '').toLowerCase()
原字符串待转换的原始文本SnakeCase转换后的蛇形命名结果原字符串 'HelloWorld 2024':先在大写字母前加下划线得 '_Hello_World 2024',再将空格替换为下划线得 '_Hello_World_2024',去掉首下划线得 'Hello_World_2024',最后全小写得 'hello_world_2024'。
5 种主流语言实现,复制即用:
import re
def to_upper(s: str) -> str:
return s.upper()
def to_lower(s: str) -> str:
return s.lower()
def capitalize_words(s: str) -> str:
return s.title()
def capitalize_sentence(s: str) -> str:
return s.capitalize()
def to_camel(s: str) -> str:
words = re.split(r'[\s_\-]+', s)
return words[0].lower() + ''.join(w.capitalize() for w in words[1:])
def to_snake(s: str) -> str:
s = re.sub(r'([A-Z])', r'_\1', s).lower()
return re.sub(r'[\s\-]+', '_', s).strip('_')
def to_kebab(s: str) -> str:
s = re.sub(r'([A-Z])', r'-\1', s).lower()
return re.sub(r'[\s_]+', '-', s).strip('-')
# 示例
print(to_upper('hello world')) # HELLO WORLD
print(to_lower('HELLO WORLD')) # hello world
print(capitalize_words('hello world')) # Hello World
print(capitalize_sentence('hello WORLD')) # Hello world
print(to_camel('hello-world_example')) # helloWorldExample
print(to_snake('helloWorldExample')) # hello_world_example
print(to_kebab('hello_world_example')) # hello-world-examplefunction toUpper(s) { return s.toUpperCase(); }
function toLower(s) { return s.toLowerCase(); }
function capitalizeWords(s) { return s.replace(/\b\w/g, c => c.toUpperCase()); }
function capitalizeSentence(s) { return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase(); }
function toCamel(s) {
const words = s.split(/[\s_\-]+/);
return words[0].toLowerCase() + words.slice(1).map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join('');
}
function toSnake(s) {
return s.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/[\s\-]+/g, '_').replace(/^_/, '');
}
function toKebab(s) {
return s.replace(/([A-Z])/g, '-$1').toLowerCase().replace(/[\s_]+/g, '-').replace(/^-/, '');
}
// 示例
console.log(toUpper('hello world')); // HELLO WORLD
console.log(toLower('HELLO WORLD')); // hello world
console.log(capitalizeWords('hello world')); // Hello World
console.log(capitalizeSentence('hello WORLD')); // Hello world
console.log(toCamel('hello-world_example')); // helloWorldExample
console.log(toSnake('helloWorldExample')); // hello_world_example
console.log(toKebab('hello_world_example')); // hello-world-examplepackage main
import (
"fmt"
"regexp"
"strings"
"unicode"
)
func toUpper(s string) string { return strings.ToUpper(s) }
func toLower(s string) string { return strings.ToLower(s) }
func capitalizeWords(s string) string { return strings.Title(s) }
func capitalizeSentence(s string) string {
r := []rune(s)
if len(r) == 0 { return s }
r[0] = unicode.ToUpper(r[0])
for i := 1; i < len(r); i++ { r[i] = unicode.ToLower(r[i]) }
return string(r)
}
func toCamel(s string) string {
re := regexp.MustCompile(`[\s_\-]+`)
words := re.Split(s, -1)
for i := 1; i < len(words); i++ {
words[i] = strings.Title(words[i])
}
return words[0] + strings.Join(words[1:], "")
}
func toSnake(s string) string {
re := regexp.MustCompile(`([A-Z])`)
s = re.ReplaceAllString(s, "_$1")
s = strings.ToLower(s)
re = regexp.MustCompile(`[\s\-]+`)
return strings.Trim(re.ReplaceAllString(s, "_"), "_")
}
func toKebab(s string) string {
re := regexp.MustCompile(`([A-Z])`)
s = re.ReplaceAllString(s, "-$1")
s = strings.ToLower(s)
re = regexp.MustCompile(`[\s_]+`)
return strings.Trim(re.ReplaceAllString(s, "-"), "-")
}
func main() {
fmt.Println(toUpper("hello world")) // HELLO WORLD
fmt.Println(toLower("HELLO WORLD")) // hello world
fmt.Println(capitalizeWords("hello world")) // Hello World
fmt.Println(capitalizeSentence("hello WORLD")) // Hello world
fmt.Println(toCamel("hello-world_example")) // helloWorldExample
fmt.Println(toSnake("helloWorldExample")) // hello_world_example
fmt.Println(toKebab("hello_world_example")) // hello-world-example
}function toUpper(s: string): string { return s.toUpperCase(); }
function toLower(s: string): string { return s.toLowerCase(); }
function capitalizeWords(s: string): string { return s.replace(/\b\w/g, c => c.toUpperCase()); }
function capitalizeSentence(s: string): string { return s.charAt(0).toUpperCase() + s.slice(1).toLowerCase(); }
function toCamel(s: string): string {
const words = s.split(/[\s_\-]+/);
return words[0].toLowerCase() + words.slice(1).map(w => w.charAt(0).toUpperCase() + w.slice(1).toLowerCase()).join('');
}
function toSnake(s: string): string {
return s.replace(/([A-Z])/g, '_$1').toLowerCase().replace(/[\s\-]+/g, '_').replace(/^_/, '');
}
function toKebab(s: string): string {
return s.replace(/([A-Z])/g, '-$1').toLowerCase().replace(/[\s_]+/g, '-').replace(/^-/, '');
}
// 示例
console.log(toUpper('hello world')); // HELLO WORLD
console.log(toLower('HELLO WORLD')); // hello world
console.log(capitalizeWords('hello world')); // Hello World
console.log(capitalizeSentence('hello WORLD')); // Hello world
console.log(toCamel('hello-world_example')); // helloWorldExample
console.log(toSnake('helloWorldExample')); // hello_world_example
console.log(toKebab('hello_world_example')); // hello-world-examplefn to_upper(s: &str) -> String { s.to_uppercase() }
fn to_lower(s: &str) -> String { s.to_lowercase() }
fn capitalize_words(s: &str) -> String {
s.split_whitespace()
.map(|w| {
let mut c = w.chars();
match c.next() {
None => String::new(),
Some(f) => f.to_uppercase().collect::<String>() + c.as_str(),
}
})
.collect::<Vec<_>>()
.join(" ")
}
fn capitalize_sentence(s: &str) -> String {
let mut chars = s.chars();
match chars.next() {
None => String::new(),
Some(f) => f.to_uppercase().collect::<String>() + &chars.as_str().to_lowercase(),
}
}
fn to_camel(s: &str) -> String {
s.split(|c: char| c.is_whitespace() || c == '_' || c == '-')
.enumerate()
.map(|(i, w)| {
if i == 0 { w.to_lowercase() }
else {
let mut c = w.chars();
match c.next() {
None => String::new(),
Some(f) => f.to_uppercase().collect::<String>() + c.as_str(),
}
}
})
.collect()
}
fn to_snake(s: &str) -> String {
let mut result = String::new();
for (i, c) in s.chars().enumerate() {
if c.is_uppercase() {
if i != 0 { result.push('_'); }
result.extend(c.to_lowercase());
} else if c.is_whitespace() || c == '-' {
result.push('_');
} else {
result.push(c);
}
}
result.trim_matches('_').to_string()
}
fn to_kebab(s: &str) -> String {
let mut result = String::new();
for (i, c) in s.chars().enumerate() {
if c.is_uppercase() {
if i != 0 { result.push('-'); }
result.extend(c.to_lowercase());
} else if c.is_whitespace() || c == '_' {
result.push('-');
} else {
result.push(c);
}
}
result.trim_matches('-').to_string()
}
fn main() {
println!("{}", to_upper("hello world")); // HELLO WORLD
println!("{}", to_lower("HELLO WORLD")); // hello world
println!("{}", capitalize_words("hello world")); // Hello World
println!("{}", capitalize_sentence("hello WORLD")); // Hello world
println!("{}", to_camel("hello-world_example")); // helloWorldExample
println!("{}", to_snake("helloWorldExample")); // hello_world_example
println!("{}", to_kebab("hello_world_example")); // hello-world-example
}选「首字母大写」模式。驼峰(CamelCase)在编程里有两种:小驼峰(userName,首字母小写)和大驼峰(UserName,首字母大写)。本工具的「首字母大写」是把每个单词首字母转大写、其余小写,结果就是大驼峰。如果你需要小驼峰(首单词首字母小写),目前没有直接模式,可以先全转小写再用首字母大写,然后把第一个字母手动改小写。
「句首大写」只把句子的第一个单词首字母转大写,其他单词保持原样,不是每个单词都大写。如果你看到每个单词首字母都变大了,说明你误选了「首字母大写」模式。检查一下工具界面上的模式按钮:句首大写通常图标是一个句号加一个字母,首字母大写是 Aa 样式。
数字和特殊符号会被保留原样,不参与大小写转换。例如「user_123_name」选蛇形(snake_case)后变成「user_123_name」—— 下划线已经符合蛇形规则,数字不变。如果选驼峰,会变成「User123Name」,数字前后单词的首字母被转大写,但数字本身不动。唯一例外是「短横」模式:它会先去掉下划线再用短横连接,但数字仍保留。
目前工具没有「驼峰转蛇形」的自动反向转换功能。你需要手动处理:先把「createdAt」拆成两个单词「created」和「At」,分别输入或用空格隔开,然后选「全小写」模式得到「created at」,再用「蛇形」模式(会自动把空格替换成下划线)得到「created_at」。或者更简单:选「全小写」后把结果中的空格手动改成下划线。
会的,因为每种模式都会重新处理整个文本的大小写规则。例如你有一段代码注释「GetUserInfo」,想保留「Get」和「User」的大写,但如果选「全小写」会变成「getuserinfo」,所有大写都会丢失。建议先想好目标格式再一次性转换;如果只想改部分单词,可以分段处理,或者先用「全小写」打底,再手动把特定字母改回大写。
是的,本工具完全在浏览器本地运行(FE 实现),输入文本不会离开你的设备。所有大小写转换逻辑由 JavaScript 在浏览器内存中执行,不经过任何后端服务器。关闭页面后数据自动清除,适合处理密码、API 密钥、内网配置等敏感内容。如果你发现页面加载慢或转换卡顿,通常是浏览器性能问题,不是数据传输问题。
可以,但取决于浏览器内存。10 万英文字符大约 100KB,现代浏览器处理这个量级的大小写转换完全没问题,一般不会崩溃。不过如果文本包含大量特殊字符(如 HTML 标签、Unicode 符号),转换速度可能略慢。建议分批处理(比如每 5 万字一次),避免浏览器标签页卡死。如果遇到卡顿,先复制粘贴到记事本保存,再刷新页面重新处理。
蛇形(snake_case)用下划线连接单词,例如「main_container」;短横(kebab-case)用连字符连接,例如「main-container」。CSS 类名推荐用短横(kebab-case),因为 CSS 语法本身使用连字符(如 background-color),且 HTML 中下划线可能被某些解析器特殊处理。蛇形更多用于 Python 变量名或数据库字段名。工具里选「短横」模式即可得到 CSS 规范格式。
隐私保证所有计算与处理均在你的浏览器本地完成,输入数据不会上传服务器,也不会保存或共享。