1. 简介
本文将介绍如何在 Java 中将一个字符串(String
)转换为标题格式(Title Case),即每个单词首字母大写,其余字母小写。
我们会展示几种自定义实现方式,也会介绍如何借助第三方库简单粗暴地完成该功能。对于日常开发中处理文本格式化、前端展示或数据清洗等场景,这个功能非常实用,避免踩坑。
2. 使用核心 Java 实现
2.1. 遍历字符逐个处理
最直接的方式是遍历字符串的每一个字符,识别“单词分隔符”(如空格),在分隔符后将下一个字符转为大写,其余字符转为小写。
我们以空格作为单词分隔符,实现如下:
public static String convertToTitleCaseIteratingChars(String text) {
if (text == null || text.isEmpty()) {
return text;
}
StringBuilder converted = new StringBuilder();
boolean convertNext = true;
for (char ch : text.toCharArray()) {
if (Character.isSpaceChar(ch)) {
convertNext = true;
} else if (convertNext) {
ch = Character.toTitleCase(ch);
convertNext = false;
} else {
ch = Character.toLowerCase(ch);
}
converted.append(ch);
}
return converted.toString();
}
✅ 关键点说明:
- 使用
Character.toTitleCase()
而非toUpperCase()
,因为它遵循 Unicode 标准,支持更多语言字符(如带重音符号的字母)。 convertNext
标志位控制是否需要大写下一个字符,遇到空格就置为true
。
🧪 测试输入:
tHis IS a tiTLe
tHis, IS a tiTLe
✅ 输出结果:
This Is A Title
This, Is A Title
⚠️ 注意:多个连续空格会被保留,适合对格式敏感的场景。
2.2. 拆分为单词处理
另一种思路是先按分隔符拆分字符串为单词数组,然后对每个单词首字母大写、其余小写,最后用相同分隔符合并。
使用 Stream
API 可以写得非常简洁:
private static final String WORD_SEPARATOR = " ";
public static String convertToTitleCaseSplitting(String text) {
if (text == null || text.isEmpty()) {
return text;
}
return Arrays
.stream(text.split(WORD_SEPARATOR))
.map(word -> word.isEmpty()
? word
: Character.toTitleCase(word.charAt(0)) + word
.substring(1)
.toLowerCase())
.collect(Collectors.joining(WORD_SEPARATOR));
}
✅ 优点:
- 逻辑清晰,易于理解。
- 利用
Stream
实现函数式编程风格。
🧪 同样输入下,输出一致:
This Is A Title
This, Is A Title
⚠️ 缺陷:
split(" ")
无法保留连续空格,因为正则拆分会把多个空格视为一个分隔。- 若需保留原始间距,建议使用方法 2.1。
3. 使用 Apache Commons Lang
如果你不想自己造轮子,Apache Commons Lang 是一个成熟稳定的工具库,提供了开箱即用的字符串处理功能。
📌 Maven 依赖:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>
它提供了 WordUtils
工具类,包含两个关键方法:
✅ capitalizeFully()
—— 推荐使用
该方法会将每个单词首字母大写,其余字母强制转为小写,正是我们想要的效果:
public static String convertToTitleCaseWordUtilsFull(String text) {
return WordUtils.capitalizeFully(text);
}
🧪 输入:
tHis IS a tiTLe
tHis, IS a tiTLe
✅ 输出:
This Is A Title
This, Is A Title
完美匹配预期,且自动处理各种空白字符(包括制表符、换行等)。
⚠️ capitalize()
—— 注意陷阱!
这个方法只大写每个单词首字母,不改变其余字母大小写:
public static String convertToTitleCaseWordUtils(String text) {
return WordUtils.capitalize(text);
}
🧪 输入相同:
tHis IS a tiTLe
❌ 输出却是:
THis IS A TiTLe
👉 所以:**如果你希望统一格式,请务必使用 capitalizeFully()
**,避免线上文本显示错乱。
4. 使用 ICU4J(国际化支持)
当你的应用需要支持多语言(如中文、阿拉伯语、泰语等)或严格遵循 Unicode 规范时,推荐使用 ICU4J —— IBM 提供的强大国际化库。
📌 Maven 依赖:
<dependency>
<groupId>com.ibm.icu</groupId>
<artifactId>icu4j</artifactId>
<version>72.1</version>
</dependency>
ICU4J 提供了更智能的文本边界识别机制,通过 BreakIterator
判断“什么是单词”,适用于复杂语言环境。
public static String convertToTitleCaseIcu4j(String text) {
if (text == null || text.isEmpty()) {
return text;
}
return UCharacter.toTitleCase(text, BreakIterator.getTitleInstance());
}
✅ 特性亮点:
BreakIterator.getTitleInstance()
使用 Unicode 的标题断词规则,比简单空格拆分更准确。- 支持传入
Locale
参数,实现本地化转换(如土耳其语中i → İ
):UCharacter.toTitleCase(text, BreakIterator.getTitleInstance(Locale.forLanguageTag("tr")));
- 即使不传
BreakIterator
,默认行为也比 JDK 更健壮。
🧪 测试结果与 capitalizeFully()
一致,但在处理特殊语言时优势明显。
5. 总结
方式 | 是否推荐 | 适用场景 |
---|---|---|
✅ 遍历字符 | ✔️ | 需精确控制格式、保留空白、无外部依赖 |
✅ 拆分单词 + Stream | ⚠️ | 简单场景可用,但注意连续空格丢失问题 |
✅ Apache Commons WordUtils.capitalizeFully() |
✅✅✅ | 日常开发首选,简洁可靠 |
✅ ICU4J UCharacter.toTitleCase() |
✅✅ | 多语言、国际化项目必备 |
📌 最终建议:
- 普通项目直接引入
commons-lang3
,一行代码搞定。 - 国际化项目上 ICU4J,别等到用户反馈“为啥我的名字变丑了”才后悔。
所有示例代码已上传至 GitHub:https://github.com/baeldung/java-string-conversions