From d571567c52c110d7d0ec381259ea8d57b6e91864 Mon Sep 17 00:00:00 2001 From: Looly Date: Sat, 23 Oct 2021 23:19:50 +0800 Subject: [PATCH] add method --- CHANGELOG.md | 5 +++- .../java/cn/hutool/core/date/DateTime.java | 11 ++++++++ .../cn/hutool/core/text/CharSequenceUtil.java | 19 +++++++++++-- .../core/text/CharSequenceUtilTest.java | 14 ++++++++++ .../main/java/cn/hutool/extra/mail/Mail.java | 6 +++- .../cn/hutool/extra/mail/MailAccount.java | 28 ++++++++++++++++++- .../src/test/resources/config/mail.setting | 4 +++ .../java/cn/hutool/http/HttpUtilTest.java | 1 + 8 files changed, 83 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index bda7041ee..7c76c83e7 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,9 +3,12 @@ ------------------------------------------------------------------------------------------------------------- -# 5.7.16 (2021-10-21) +# 5.7.16 (2021-10-23) ### 🐣新特性 +* 【core 】 增加DateTime.toLocalDateTime +* 【core 】 CharSequenceUtil增加normalize方法(pr#444@Gitee) +* 【core 】 MailAccount增加setEncodefilename()方法,可选是否编码附件的文件名(issue#I4F160@Gitee) ### 🐞Bug修复 diff --git a/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java b/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java index 6758c3768..d577399a7 100644 --- a/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java +++ b/hutool-core/src/main/java/cn/hutool/core/date/DateTime.java @@ -12,6 +12,7 @@ import java.sql.Timestamp; import java.text.DateFormat; import java.text.SimpleDateFormat; import java.time.Instant; +import java.time.LocalDateTime; import java.time.ZoneId; import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; @@ -701,6 +702,16 @@ public class DateTime extends Date { return new java.sql.Date(getTime()); } + /** + * 转换为 {@link LocalDateTime} + * + * @return {@link LocalDateTime} + * @since 5.7.16 + */ + public LocalDateTime toLocalDateTime() { + return LocalDateTimeUtil.of(this); + } + /** * 计算相差时长 * diff --git a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java index 1a41d7282..6ca7f6c32 100644 --- a/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java +++ b/hutool-core/src/main/java/cn/hutool/core/text/CharSequenceUtil.java @@ -18,6 +18,7 @@ import cn.hutool.core.util.StrUtil; import java.nio.ByteBuffer; import java.nio.charset.Charset; import java.text.MessageFormat; +import java.text.Normalizer; import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedList; @@ -4338,7 +4339,21 @@ public class CharSequenceUtil { * @return 给定字符串的所有字符是否都一样 * @since 5.7.3 */ - public static boolean isCharEquals(String str) { - return isBlank(str.replace(str.charAt(0), CharUtil.SPACE)); + public static boolean isCharEquals(CharSequence str) { + Assert.notEmpty(str, "Str to check must be not empty!"); + return count(str, str.charAt(0)) == str.length(); + } + + /** + * 对字符串归一化处理,如 "Á" 可以使用 "u00C1"或 "u0041u0301"表示,实际测试中两个字符串并不equals
+ * 因此使用此方法归一为一种表示形式,默认按照W3C通常建议的,在NFC中交换文本。 + * + * @param str 归一化的字符串 + * @return 归一化后的字符串 + * @see Normalizer#normalize(CharSequence, Normalizer.Form) + * @since 5.7.16 + */ + public static String normalize(CharSequence str) { + return Normalizer.normalize(str, Normalizer.Form.NFC); } } diff --git a/hutool-core/src/test/java/cn/hutool/core/text/CharSequenceUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/text/CharSequenceUtilTest.java index bec53ad4d..85a35a18c 100644 --- a/hutool-core/src/test/java/cn/hutool/core/text/CharSequenceUtilTest.java +++ b/hutool-core/src/test/java/cn/hutool/core/text/CharSequenceUtilTest.java @@ -33,5 +33,19 @@ public class CharSequenceUtilTest { Assert.assertEquals( str + " is Good", result); } + @Test + public void normalizeTest(){ + // https://blog.csdn.net/oscar999/article/details/105326270 + + String str1 = "\u00C1"; + String str2 = "\u0041\u0301"; + + Assert.assertNotEquals(str1, str2); + + str1 = CharSequenceUtil.normalize(str1); + str2 = CharSequenceUtil.normalize(str2); + Assert.assertEquals(str1, str2); + } + // ------------------------------------------------------------------------ remove } diff --git a/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java index 1f28d16a9..e4ce322c9 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/mail/Mail.java @@ -36,6 +36,7 @@ import java.util.Date; * @since 3.2.0 */ public class Mail implements Builder { + private static final long serialVersionUID = 1L; /** * 邮箱帐户信息以及一些客户端配置信息 @@ -262,7 +263,10 @@ public class Mail implements Builder { for (DataSource attachment : attachments) { bodyPart = new MimeBodyPart(); bodyPart.setDataHandler(new DataHandler(attachment)); - nameEncoded = InternalMailUtil.encodeText(attachment.getName(), charset); + nameEncoded = attachment.getName(); + if(this.mailAccount.isEncodefilename()){ + nameEncoded = InternalMailUtil.encodeText(nameEncoded, charset); + } // 普通附件文件名 bodyPart.setFileName(nameEncoded); if (StrUtil.startWith(attachment.getContentType(), "image/")) { diff --git a/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java b/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java index 925550241..8ea8aed62 100644 --- a/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java +++ b/hutool-extra/src/main/java/cn/hutool/extra/mail/MailAccount.java @@ -34,8 +34,10 @@ public class MailAccount implements Serializable { private static final String SOCKET_FACTORY_FALLBACK = "mail.smtp.socketFactory.fallback"; private static final String SOCKET_FACTORY_PORT = "smtp.socketFactory.port"; + // 其他 private static final String MAIL_DEBUG = "mail.debug"; private static final String SPLIT_LONG_PARAMS = "mail.mime.splitlongparameters"; + // private static final String ENCODE_FILE_NAME = "mail.mime.encodefilename"; public static final String[] MAIL_SETTING_PATHS = new String[]{"config/mail.setting", "config/mailAccount.setting", "mail.setting"}; @@ -75,7 +77,11 @@ public class MailAccount implements Serializable { /** * 对于超长参数是否切分为多份,默认为false(国内邮箱附件不支持切分的附件名) */ - private boolean splitlongparameters; + private boolean splitlongparameters = false; + /** + * 对于文件名是否使用{@link #charset}编码,默认为 {@code true} + */ + private boolean encodefilename = true; /** * 使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。它将纯文本连接升级为加密连接(TLS或SSL), 而不是使用一个单独的加密通信端口。 @@ -332,6 +338,26 @@ public class MailAccount implements Serializable { this.splitlongparameters = splitlongparameters; } + /** + * 对于文件名是否使用{@link #charset}编码,默认为 {@code true} + * + * @return 对于文件名是否使用{@link #charset}编码,默认为 {@code true} + * @since 5.7.16 + */ + public boolean isEncodefilename() { + return encodefilename; + } + + /** + * 设置对于文件名是否使用{@link #charset}编码 + * + * @param encodefilename 对于文件名是否使用{@link #charset}编码 + * @since 5.7.16 + */ + public void setEncodefilename(boolean encodefilename) { + this.encodefilename = encodefilename; + } + /** * 是否使用 STARTTLS安全连接,STARTTLS是对纯文本通信协议的扩展。它将纯文本连接升级为加密连接(TLS或SSL), 而不是使用一个单独的加密通信端口。 * diff --git a/hutool-extra/src/test/resources/config/mail.setting b/hutool-extra/src/test/resources/config/mail.setting index a7aa08342..f9a9cf720 100644 --- a/hutool-extra/src/test/resources/config/mail.setting +++ b/hutool-extra/src/test/resources/config/mail.setting @@ -20,3 +20,7 @@ starttlsEnable = true sslEnable = true # 调试模式 debug = true +# 对于超长参数是否切分为多份,默认为false(国内邮箱附件不支持切分的附件名) +splitlongparameters = false +# 是否编码附件文件名(默认true) +encodefilename = true diff --git a/hutool-http/src/test/java/cn/hutool/http/HttpUtilTest.java b/hutool-http/src/test/java/cn/hutool/http/HttpUtilTest.java index e829d7752..b89e7ea99 100644 --- a/hutool-http/src/test/java/cn/hutool/http/HttpUtilTest.java +++ b/hutool-http/src/test/java/cn/hutool/http/HttpUtilTest.java @@ -346,4 +346,5 @@ public class HttpUtilTest { .execute().body(); Console.log(body); } + }