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


原始标题:Convert a String to Title Case

« 上一篇: Joda-Time 介绍
» 下一篇: JavaPoet 使用指南