鸿蒙PC适配llvm-gcc-compat编译安装第三方库convert_case,打造Rust 第三方字符串命名风格互相转换
欢迎加入开源鸿蒙PC社区: https://harmonypc.csdn.net/
欢迎在PC社区平台申请新建项目:https://atomgit.com/OpenHarmonyPCDeveloper
AtomGit 仓库地址:https://atomgit.com/OpenHarmonyPCDeveloper/ohos_rust_cargo
本文讲解鸿蒙 PC 端 Rust 开发环境搭建,鸿蒙基于 musl 库、强制二进制签名,无法直接使用通用 Linux 编译产物。需借助鸿蒙专属包管理器 Harmonybrew,提供两套编译方案:方案一安装 llvm-gcc-compat,零配置开箱即用;方案二仅安装 ohos-sdk,需手动配置 Cargo 链接器,二者都依托 ohos-sdk 完成自动签名编译。
可以来参考一下这个文章搭建环境OpenHarmony 鸿蒙 PC + CodeArts IDE 实现 Rust开发完整开发环境搭建指南
一、库是什么 & 核心作用
convert_case 是专门做字符串命名风格互相转换的轻量 Rust 库,开发中高频场景:
前后端字段命名转换、结构体字段驼峰/下划线互转、文件命名、数据库字段、路由名、常量名等。
支持全部主流命名风格
snake:下划线小写user_name_info(数据库、rust变量)screaming_snake:全大写下划线USER_NAME_INFO(常量)kebab:短横线小写user-name-info(URL、文件名、css)camel:小驼峰userNameInfo(JS/前端JSON)pascal:大驼峰UserNameInfo(Rust/Java 结构体、类名)lower纯小写、upper纯大写
业务使用场景
- 后端Rust结构体(snake)序列化JSON自动转小驼峰 camel
- 数据库字段下划线 ↔ 前端JSON驼峰互转
- 代码生成工具:表名生成结构体、常量名
- 路由路径、文件名统一格式转换
- 日志、错误提示统一命名格式化
二、安装依赖
cargo add convert_case
Cargo.toml
[dependencies]
convert_case = "0.6"

三、完整无报错 main.rs
覆盖所有常用格式、批量转换、混合大小写兼容
use convert_case::{Case, Casing};
fn main() {
// 原始混合格式字符串
let raw = "userNameInfo_age-data";
println!("原始字符串: {raw}\n");
// 1. snake_case 小写下划线(rust变量、数据库字段)
let snake = raw.to_case(Case::Snake);
println!("Snake(下划线小写): {snake}");
// 2. UpperSnake 全大写下划线(常量,替代不存在的 ScreamingSnake)
let upper_snake = raw.to_case(Case::UpperSnake);
println!("UpperSnake(常量大写): {upper_snake}");
// 3. kebab-case 短横线分隔
let kebab = raw.to_case(Case::Kebab);
println!("Kebab(短横线): {kebab}");
// 4. camelCase 小驼峰(前端JSON)
let camel = raw.to_case(Case::Camel);
println!("Camel(小驼峰): {camel}");
// 5. PascalCase 大驼峰(结构体/类名)
let pascal = raw.to_case(Case::Pascal);
println!("Pascal(大驼峰): {pascal}");
// 6. 纯小写、纯大写
let lower = raw.to_case(Case::Lower);
let upper = raw.to_case(Case::Upper);
println!("Lower(全小写): {lower}");
println!("Upper(全大写): {upper}");
println!("\n===== 多格式统一转换测试 =====");
let test_list = [
"order_id",
"OrderId",
"order-id",
"ORDER_ID",
"orderId",
];
for s in test_list {
let camel = s.to_case(Case::Camel);
let snake = s.to_case(Case::Snake);
println!("{s:15} → camel:{camel:12} snake:{snake}");
}
println!("\n===== 业务场景:数据库字段 ↔ JSON驼峰 =====");
let db_field = "user_phone_number";
let json_field = db_field.to_case(Case::Camel);
println!("数据库下划线字段: {db_field}");
println!("前端JSON驼峰字段: {json_field}");
// 代码生成示例:表名转结构体、常量名
println!("\n===== 代码生成示例 =====");
let table_name = "order_detail";
let struct_name = table_name.to_case(Case::Pascal);
let const_name = table_name.to_case(Case::UpperSnake);
println!("数据表 {} → 结构体 struct {}", table_name, struct_name);
println!("数据表 {} → 常量 const {}: u64 = 1;", table_name, const_name);
}

运行
cargo run
convert_case 是专门用来字符串命名风格互相转换的轻量库,后端开发、代码生成、数据库与JSON字段互转高频工具。
能自动识别混合分隔符(下划线_、短横线-、驼峰大小写分界),统一转换成目标命名规范。
一、依赖引入
use convert_case::{Case, Casing};
convert_case 是 Rust 专门做字符串命名风格互转的第三方 crate,支持所有开发常用命名格式:下划线、驼峰、短横线、常量大写等。
使用前需要在 Cargo.toml 添加依赖:
[dependencies]
convert_case = "0.6"
Case:枚举,代表目标格式(Snake / Camel / Pascal 等)Casing:trait,给字符串增加.to_case()转换方法
二、main 入口基础转换演示
let raw = "userNameInfo_age-data";
println!("原始字符串: {raw}\n");
原始混合字符串同时包含小驼峰、下划线、短横线,用来测试库自动分割单词的能力。
1. Snake 小写下划线(Rust变量、数据库字段)
let snake = raw.to_case(Case::Snake);
// 输出:user_name_info_age_data
所有单词小写,单词之间用下划线分隔,后端数据库表字段、rust普通变量标准格式。
2. UpperSnake 全大写下划线(常量)
let upper_snake = raw.to_case(Case::UpperSnake);
// 输出:USER_NAME_INFO_AGE_DATA
全大写+下划线,Rust/Go/C++ 常量专用格式,行业俗称 screaming snake case。
3. Kebab 短横线分隔(URL、前端css类名)
let kebab = raw.to_case(Case::Kebab);
// 输出:user-name-info-age-data
单词小写、横线隔开,网页路由、CSS class、文件命名常用。
4. Camel 小驼峰(JSON、JS/TS接口字段)
let camel = raw.to_case(Case::Camel);
// 输出:userNameInfoAgeData
第一个单词小写,后续每个单词首字母大写,前后端交互 JSON 标准字段格式。
5. Pascal 大驼峰(结构体、类、枚举名)
let pascal = raw.to_case(Case::Pascal);
// 输出:UserNameInfoAgeData
每个单词首字母全部大写,Rust struct、enum、TypeScript class 命名规范。
6. Lower / Upper 纯小写、纯大写
let lower = raw.to_case(Case::Lower);
let upper = raw.to_case(Case::Upper);
单纯把所有字符转小写/大写,不做单词分隔,简单文本统一大小写场景用。
三、多格式统一标准化测试
let test_list = [
"order_id",
"OrderId",
"order-id",
"ORDER_ID",
"orderId",
];
for s in test_list {
let camel = s.to_case(Case::Camel);
let snake = s.to_case(Case::Snake);
println!("{s:15} → camel:{camel:12} snake:{snake}");
}
核心作用:无论输入是什么杂乱格式,都能统一转换成指定格式。
比如 order_id / OrderId / order-id 全部能标准化为统一的 camel、snake,适合做参数统一、数据字段映射。
四、业务场景:数据库字段 ↔ JSON 驼峰
let db_field = "user_phone_number";
let json_field = db_field.to_case(Case::Camel);
println!("数据库下划线字段: {db_field}");
println!("前端JSON驼峰字段: {json_field}");
后端最常用场景:
数据库存储是下划线 user_phone_number,返回给前端 JSON 需要转小驼峰 userPhoneNumber,序列化/反序列化字段映射核心工具。
五、代码生成场景(代码脚手架、ORM工具)
let table_name = "order_detail";
let struct_name = table_name.to_case(Case::Pascal);
let const_name = table_name.to_case(Case::UpperSnake);
println!("数据表 {} → 结构体 struct {}", table_name, struct_name);
println!("数据表 {} → 常量 const {}: u64 = 1;", table_name, const_name);
适合 ORM、代码生成器:
数据库表名 order_detail
- 转 Pascal 作为结构体名称:
OrderDetail - 转 UpperSnake 作为表ID常量:
ORDER_DETAIL
整体核心能力总结
- 自动识别混合分隔符(下划线、横线、驼峰)拆分单词,不用自己分割字符串;
- 一行代码完成任意命名格式互相转换;
- 覆盖后端开发高频场景:数据库映射、JSON序列化、常量定义、结构体生成、URL命名;
- 无复杂正则,性能稳定,Rust项目做字段转换首选库。
运行输出示例
原始字符串: userNameInfo_age-data
Snake(下划线小写): user_name_info_age_data
UpperSnake(常量大写): USER_NAME_INFO_AGE_DATA
Kebab(短横线): user-name-info-age-data
Camel(小驼峰): userNameInfoAgeData
Pascal(大驼峰): UserNameInfoAgeData
Lower(全小写): usernameinfo_age-data
Upper(全大写): USERNAMEINFO_AGE-DATA
===== 多格式统一转换测试 =====
order_id → camel:orderId snake:order_id
OrderId → camel:orderId snake:order_id
order-id → camel:orderId snake:order_id
ORDER_ID → camel:orderId snake:order_id
orderId → camel:orderId snake:order_id
===== 业务场景:数据库字段 ↔ JSON驼峰 =====
数据库下划线字段: user_phone_number
前端JSON驼峰字段: userPhoneNumber
===== 代码生成示例 =====
数据表 order_detail → 结构体 struct OrderDetail
数据表 order_detail → 常量 const ORDER_DETAIL: u64 = 1;
一、Cargo 依赖配置
[dependencies]
convert_case = "0.6"
导入核心类型:
use convert_case::{Case, Casing};
Casingtrait:给所有&str / String挂载.to_case(Case)转换方法Case枚举:所有支持的命名风格常量
二、基础转换部分逐段解析
原始字符串:"userNameInfo_age-data"
混合了小驼峰、下划线、短横线三种分隔符,库会自动拆分单词列表:
拆分单词序列:["user", "name", "info", "age", "data"]
所有转换都是基于这套拆分后的单词重新拼接。
1. Case::Snake — snake_case 小写下划线
let snake = raw.to_case(Case::Snake);
println!("Snake(下划线小写): {snake}");
输出:user_name_info_age_data
适用场景:
Rust 变量、函数名、数据库表字段、SQL 列名。
2. Case::UpperSnake — SCREAMING_SNAKE 全大写下划线
let upper_snake = raw.to_case(Case::UpperSnake);
println!("UpperSnake(常量大写): {upper_snake}");
输出:USER_NAME_INFO_AGE_DATA
适用场景:Rust / C / Java 全局常量、枚举标识。
3. Case::Kebab — kebab-case 短横线小写
let kebab = raw.to_case(Case::Kebab);
println!("Kebab(短横线): {kebab}");
输出:user-name-info-age-data
适用场景:URL路径、前端CSS class、文件名、接口路由。
4. Case::Camel — camelCase 小驼峰(首字母小写)
let camel = raw.to_case(Case::Camel);
println!("Camel(小驼峰): {camel}");
输出:userNameInfoAgeData
适用场景:JavaScript/TypeScript JSON 对象字段、前端变量。
5. Case::Pascal — PascalCase 大驼峰(首字母大写)
let pascal = raw.to_case(Case::Pascal);
println!("Pascal(大驼峰): {pascal}");
输出:UserNameInfoAgeData
适用场景:Rust struct / enum、Java Class、TS Interface。
6. Case::Lower / Case::Upper 纯大小写
let lower = raw.to_case(Case::Lower);
let upper = raw.to_case(Case::Upper);
println!("Lower(全小写): {lower}");
println!("Upper(全大写): {upper}");
- Lower:
usernameinfo_age-data(仅全部小写,不删除分隔符) - Upper:
USERNAMEINFO_AGE-DATA(仅全部大写,保留原有符号)
和 Snake/Kebab 区别:不会重新拆分重组单词,只改字母大小写。
三、多格式统一转换测试
let test_list = [
"order_id",
"OrderId",
"order-id",
"ORDER_ID",
"orderId",
];
for s in test_list {
let camel = s.to_case(Case::Camel);
let snake = s.to_case(Case::Snake);
println!("{s:15} → camel:{camel:12} snake:{snake}");
}
核心特性:输入任意风格,输出统一结果
无论输入是下划线、大驼峰、短横线、常量大写、小驼峰,底层都会拆分成 ["order", "id"],再生成目标格式:
所有输入转 camel 统一得到 orderId
所有输入转 snake 统一得到 order_id
输出结果:
order_id → camel:orderId snake:order_id
OrderId → camel:orderId snake:order_id
order-id → camel:orderId snake:order_id
ORDER_ID → camel:orderId snake:order_id
orderId → camel:orderId snake:order_id
业务价值:数据库同步JSON、代码生成时不用兼容各种输入格式,统一转换即可。
四、业务场景1:数据库字段 ↔ JSON 前端字段
let db_field = "user_phone_number";
let json_field = db_field.to_case(Case::Camel);
println!("数据库下划线字段: {db_field}");
println!("前端JSON驼峰字段: {json_field}");
输出:
数据库下划线字段: user_phone_number
前端JSON驼峰字段: userPhoneNumber
配套 serde 经典联用场景
配合序列化自动转换字段名,不用手写大量 #[serde(rename)]:
// 数据库 snake → JSON camel 自动映射
#[serde(rename_all = "camelCase")]
struct User {
user_phone_number: String
}
开发CRUD工具、ORM框架、代码生成器必备组合。
五、业务场景2:数据库表名生成 Rust 代码
let table_name = "order_detail";
let struct_name = table_name.to_case(Case::Pascal);
let const_name = table_name.to_case(Case::UpperSnake);
println!("数据表 {} → 结构体 struct {}", table_name, struct_name);
println!("数据表 {} → 常量 const {}: u64 = 1;", table_name, const_name);
输出:
数据表 order_detail → 结构体 struct OrderDetail
数据表 order_detail → 常量 const ORDER_DETAIL: u64 = 1;
使用场景:数据库代码生成工具
读取表名 order_detail:
- 生成实体结构体
struct OrderDetail(Pascal) - 生成表名常量
const ORDER_DETAIL_TABLE(UpperSnake) - 字段转小驼峰用于接口返回(Camel)
- 字段转下划线用于SQL查询(Snake)
六、底层核心原理(为什么混合字符串也能正确转换)
- 分词规则:
- 下划线
_、短横线-、空格 直接作为单词分隔 - 大小写交界处拆分:
userName→ user + Name
- 下划线
- 全部拆分后得到纯单词数组,无视原有分隔符
- 根据目标
Case规则重新拼接单词- Snake:单词小写,
_连接 - Camel:首单词小写,其余首字母大写,无分隔符
- Pascal:全部单词首字母大写,无分隔符
- Kebab:单词小写,
-连接
- Snake:单词小写,
七、各 Case 场景速查表
| Case 枚举 | 样式 | 典型用途 |
|---|---|---|
| Snake | user_info |
Rust变量、数据库字段 |
| UpperSnake | USER_INFO |
常量、枚举值 |
| Camel | userInfo |
JS/JSON字段、前端变量 |
| Pascal | UserInfo |
struct、类名、接口 |
| Kebab | user-info |
URL、CSS、文件名 |
| Lower / Upper | 仅改大小写 | 简单文本格式化 |
八、常见搭配库实战场景
serde + convert_case:ORM 实体自动转换数据库/JSON字段sqlx + convert_case:数据库表名自动生成Rust结构体- 代码生成工具(build.rs):批量转换命名规范
- HTTP接口:统一入参驼峰 ↔ 数据库下划线互转
- 配置文件解析:不同命名风格配置标准化
四、核心API说明
1. trait Casing(自动给 &str/String 增加方法)
.to_case(Case::X):一键转为目标命名风格.to_words():把字符串拆分为单词 Vec,可自定义拼接
2. Case 枚举全部变体
| 枚举值 | 输出示例 | 使用场景 |
|---|---|---|
| Snake | user_info |
Rust变量、数据库表字段 |
| ScreamingSnake | USER_INFO |
常量定义 const MAX_SIZE: u32 = 100 |
| Kebab | user-info |
URL路径、文件名称、CSS类名 |
| Camel | userInfo |
JS/TS、JSON前端返回字段 |
| Pascal | UserInfo |
Rust struct / enum、Java Class |
| Lower | userinfo |
全小写无分隔 |
| Upper | USERINFO |
全大写无分隔 |
3. 核心特性:自动分词
无论输入是驼峰、下划线、横线混合,库内部自动分割单词,不用手动清洗字符串:
输入 userName_age-id 统一拆分为 ["user", "name", "age", "data"],再重新拼接为目标格式。
五、高频实战拓展场景
场景1:配合serde全局结构体驼峰序列化(代码生成常用)
不需要手动每个字段加 rename,批量转换所有字段名:
use convert_case::{Case, Casing};
fn db_to_json_field(db_name: &str) -> String {
db_name.to_case(Case::Camel)
}
fn json_to_db_field(json_name: &str) -> String {
json_name.to_case(Case::Snake)
}
fn main() {
let db_cols = ["user_id", "order_price", "create_time"];
for col in db_cols {
println!("db:{col} → json:{}", db_to_json_field(col));
}
}
场景2:代码生成工具(ORM/表生成结构体)
// 数据库表名 order_detail → Pascal 结构体 OrderDetail
let table_name = "order_detail";
let struct_name = table_name.to_case(Case::Pascal);
println!("表 {table_name} 对应结构体 struct {struct_name}");
场景3:生成常量名
let field = "max_page_size";
let const_name = field.to_case(Case::ScreamingSnake);
println!("const {const_name}: u32 = 100;");
六、库优势
- 零依赖、体积极小、编译速度快
- 自动兼容各种混合分隔符输入,容错性强
- API极简,只需要
.to_case()一行转换 - 支持所有行业标准命名规范,覆盖前后端、数据库、代码生成全场景
- 无运行时开销,纯编译期逻辑,性能极高
更多推荐



所有评论(0)