mirror of
https://github.com/nsnail/ns-ext.git
synced 2025-04-20 01:22:51 +08:00
<feat> + Unicode,UnicodeDe
This commit is contained in:
parent
9ae1046dca
commit
09352ac5ea
@ -12,7 +12,6 @@ public static class ByteExtensions
|
|||||||
return Convert.ToBase64String(me);
|
return Convert.ToBase64String(me);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 将字节数组解码成字符串
|
/// 将字节数组解码成字符串
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -24,7 +23,6 @@ public static class ByteExtensions
|
|||||||
return e.GetString(me);
|
return e.GetString(me);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 将字节数组解码成字符串
|
/// 将字节数组解码成字符串
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -41,12 +39,21 @@ public static class ByteExtensions
|
|||||||
/// <param name="me"></param>
|
/// <param name="me"></param>
|
||||||
/// <param name="upperCase">是否大写</param>
|
/// <param name="upperCase">是否大写</param>
|
||||||
/// <param name="splitShar">字节间分隔符</param>
|
/// <param name="splitShar">字节间分隔符</param>
|
||||||
|
/// <param name="splitInterval">分隔符跳跃字节数</param>
|
||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static string String(this byte[] me, bool upperCase = true, string splitShar = null)
|
public static string String(this IEnumerable<byte> me, bool upperCase = true, string splitShar = ""
|
||||||
|
, int splitInterval = 1)
|
||||||
{
|
{
|
||||||
var ret = BitConverter.ToString(me);
|
var sb = new StringBuilder();
|
||||||
if (!upperCase) ret = ret.ToLower();
|
var i = 0;
|
||||||
if (splitShar != "-") ret = ret.Replace("-", splitShar ?? string.Empty);
|
foreach (var c in me.Select(x => x.ToString(upperCase ? "X2" : "x2"))) {
|
||||||
return ret;
|
if (i++ % splitInterval == 0) {
|
||||||
|
sb.Append(splitShar);
|
||||||
|
}
|
||||||
|
|
||||||
|
sb.Append(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
return sb.ToString();
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -1,31 +1,15 @@
|
|||||||
// ReSharper disable UnusedMember.Global
|
// ReSharper disable UnusedMember.Global
|
||||||
|
|
||||||
|
|
||||||
using System.Security.Cryptography;
|
using System.Security.Cryptography;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
|
||||||
namespace NSExt.Extensions;
|
namespace NSExt.Extensions;
|
||||||
|
|
||||||
public static class StringExtensions
|
public static partial class StringExtensions
|
||||||
{
|
{
|
||||||
private static readonly JsonSerializerOptions _defaultJsonSerializerOptions
|
private static readonly JsonSerializerOptions _defaultJsonSerializerOptions
|
||||||
= default(JsonSerializerOptions).NewJsonSerializerOptions();
|
= default(JsonSerializerOptions).NewJsonSerializerOptions();
|
||||||
|
|
||||||
/// <summary>
|
|
||||||
/// MD5 hmac编码
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="me">字符串</param>
|
|
||||||
/// <param name="key">密钥</param>
|
|
||||||
/// <param name="e">字符串使用的编码</param>
|
|
||||||
/// <returns>hash摘要的16进制文本形式(无连字符小写)</returns>
|
|
||||||
private static string Md5Hmac(this string me, string key, Encoding e)
|
|
||||||
{
|
|
||||||
using var md5Hmac = new HMACMD5(e.GetBytes(key));
|
|
||||||
return BitConverter.ToString(md5Hmac.ComputeHash(e.GetBytes(me)))
|
|
||||||
.Replace("-", string.Empty)
|
|
||||||
.ToLower(CultureInfo.CurrentCulture);
|
|
||||||
}
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// aes加密
|
/// aes加密
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -47,7 +31,6 @@ public static class StringExtensions
|
|||||||
return decrypted.Base64();
|
return decrypted.Base64();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// aes解密
|
/// aes解密
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -98,7 +81,7 @@ public static class StringExtensions
|
|||||||
/// <returns>解码后的原始字符串</returns>
|
/// <returns>解码后的原始字符串</returns>
|
||||||
public static string Base64De(this string me, Encoding e)
|
public static string Base64De(this string me, Encoding e)
|
||||||
{
|
{
|
||||||
return e.GetString(Base64De(me));
|
return e.GetString(me.Base64De());
|
||||||
}
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
@ -156,7 +139,6 @@ public static class StringExtensions
|
|||||||
: ret;
|
: ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 将字符串转换成日期对象
|
/// 将字符串转换成日期对象
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -178,7 +160,6 @@ public static class StringExtensions
|
|||||||
return decimal.Parse(me, CultureInfo.CurrentCulture);
|
return decimal.Parse(me, CultureInfo.CurrentCulture);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 尝试将字符串转为decimal
|
/// 尝试将字符串转为decimal
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -190,7 +171,6 @@ public static class StringExtensions
|
|||||||
return !decimal.TryParse(me, out var ret) ? def : ret;
|
return !decimal.TryParse(me, out var ret) ? def : ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// string to double
|
/// string to double
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -212,7 +192,6 @@ public static class StringExtensions
|
|||||||
return (T)System.Enum.Parse(typeof(T), name, true);
|
return (T)System.Enum.Parse(typeof(T), name, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 将字符串转换成枚举对象
|
/// 将字符串转换成枚举对象
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -235,7 +214,6 @@ public static class StringExtensions
|
|||||||
return float.Parse(me, CultureInfo.CurrentCulture);
|
return float.Parse(me, CultureInfo.CurrentCulture);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 将字符串转为guid
|
/// 将字符串转为guid
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -257,7 +235,6 @@ public static class StringExtensions
|
|||||||
return System.Guid.TryParse(me, out var ret) ? ret : def;
|
return System.Guid.TryParse(me, out var ret) ? ret : def;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 将字符串转换成字节数组形式
|
/// 将字符串转换成字节数组形式
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -268,6 +245,7 @@ public static class StringExtensions
|
|||||||
{
|
{
|
||||||
return e.GetBytes(me);
|
return e.GetBytes(me);
|
||||||
}
|
}
|
||||||
|
//public static byte[] TextHex(this string me,)
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 将字符串转换成字节数组形式
|
/// 将字符串转换成字节数组形式
|
||||||
@ -279,7 +257,6 @@ public static class StringExtensions
|
|||||||
return me.Hex(Encoding.UTF8);
|
return me.Hex(Encoding.UTF8);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 对一个字符串进行sha1 hash运算
|
/// 对一个字符串进行sha1 hash运算
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -337,7 +314,6 @@ public static class StringExtensions
|
|||||||
return !int.TryParse(me, out var ret) ? def : ret;
|
return !int.TryParse(me, out var ret) ? def : ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// string to Int64
|
/// string to Int64
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -369,7 +345,6 @@ public static class StringExtensions
|
|||||||
return BitConverter.ToInt32(me.Split('.').Select(byte.Parse).Reverse().ToArray(), 0);
|
return BitConverter.ToInt32(me.Split('.').Select(byte.Parse).Reverse().ToArray(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 是否base64字符串
|
/// 是否base64字符串
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -380,15 +355,23 @@ public static class StringExtensions
|
|||||||
// 一个合法的Base64,有着以下特征:
|
// 一个合法的Base64,有着以下特征:
|
||||||
// 字符串的长度为4的整数倍。
|
// 字符串的长度为4的整数倍。
|
||||||
// 字符串的符号取值只能在A -Z, a -z, 0 -9, +, /, =共计65个字符中,且 = 如果出现就必须在结尾出现。
|
// 字符串的符号取值只能在A -Z, a -z, 0 -9, +, /, =共计65个字符中,且 = 如果出现就必须在结尾出现。
|
||||||
if (!me.All(x => x.IsBase64Character())) return false;
|
if (!me.All(x => x.IsBase64Character())) {
|
||||||
if (me.Length % 4 != 0) return false;
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (me.Length % 4 != 0) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
var firstEqualSignPos = me.IndexOf('=');
|
var firstEqualSignPos = me.IndexOf('=');
|
||||||
if (firstEqualSignPos < 0) return true;
|
if (firstEqualSignPos < 0) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
var lastEqualSignPos = me.LastIndexOf('=');
|
var lastEqualSignPos = me.LastIndexOf('=');
|
||||||
return lastEqualSignPos == me.Length - 1 && me[firstEqualSignPos..lastEqualSignPos].All(x => x == '=');
|
return lastEqualSignPos == me.Length - 1 && me[firstEqualSignPos..lastEqualSignPos].All(x => x == '=');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 中文姓名打马赛克
|
/// 中文姓名打马赛克
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -396,7 +379,9 @@ public static class StringExtensions
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static string MaskChineseName(this string me)
|
public static string MaskChineseName(this string me)
|
||||||
{
|
{
|
||||||
if (me.Length == 2) return "*" + me[1..];
|
if (me.Length == 2) {
|
||||||
|
return "*" + me[1..];
|
||||||
|
}
|
||||||
|
|
||||||
return me[..1] + "*" + me[^1..];
|
return me[..1] + "*" + me[^1..];
|
||||||
}
|
}
|
||||||
@ -411,7 +396,6 @@ public static class StringExtensions
|
|||||||
return new Regex(@"^(\d{3})\d{4}(\d{4})$").Replace(me, "$1****$2");
|
return new Regex(@"^(\d{3})\d{4}(\d{4})$").Replace(me, "$1****$2");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 对一个字符串进行md5hash运算
|
/// 对一个字符串进行md5hash运算
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -437,7 +421,6 @@ public static class StringExtensions
|
|||||||
return me.AsEnumerable().NullOrEmpty() ? defVal : me;
|
return me.AsEnumerable().NullOrEmpty() ? defVal : me;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// null或空白字符
|
/// null或空白字符
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -459,7 +442,6 @@ public static class StringExtensions
|
|||||||
return JsonSerializer.Deserialize<T>(me, options ?? _defaultJsonSerializerOptions);
|
return JsonSerializer.Deserialize<T>(me, options ?? _defaultJsonSerializerOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 反序列化一个文件获得指定类型的数据对象
|
/// 反序列化一个文件获得指定类型的数据对象
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -472,7 +454,6 @@ public static class StringExtensions
|
|||||||
return JsonSerializer.Deserialize(me, type, options ?? _defaultJsonSerializerOptions);
|
return JsonSerializer.Deserialize(me, type, options ?? _defaultJsonSerializerOptions);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 生成密码
|
/// 生成密码
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -503,7 +484,6 @@ public static class StringExtensions
|
|||||||
return me.Replace("\r", "").Replace("\n", "");
|
return me.Replace("\r", "").Replace("\n", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 对一个字符串进行sha1 hash运算
|
/// 对一个字符串进行sha1 hash运算
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -518,7 +498,6 @@ public static class StringExtensions
|
|||||||
.ToLower(CultureInfo.CurrentCulture);
|
.ToLower(CultureInfo.CurrentCulture);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 蛇形命名
|
/// 蛇形命名
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -529,7 +508,6 @@ public static class StringExtensions
|
|||||||
return Regex.Replace(me, "([A-Z])", "-$1").ToLower().TrimStart('-');
|
return Regex.Replace(me, "([A-Z])", "-$1").ToLower().TrimStart('-');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// 截取指定长度的字符串,代替substring
|
/// 截取指定长度的字符串,代替substring
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@ -539,7 +517,10 @@ public static class StringExtensions
|
|||||||
/// <returns></returns>
|
/// <returns></returns>
|
||||||
public static string Sub(this string me, int startIndex, int length)
|
public static string Sub(this string me, int startIndex, int length)
|
||||||
{
|
{
|
||||||
if (startIndex + length > me.Length) length = me.Length - startIndex;
|
if (startIndex + length > me.Length) {
|
||||||
|
length = me.Length - startIndex;
|
||||||
|
}
|
||||||
|
|
||||||
return me.Substring(startIndex, length);
|
return me.Substring(startIndex, length);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -562,9 +543,23 @@ public static class StringExtensions
|
|||||||
{
|
{
|
||||||
var ret = me.Replace(" ", " ");
|
var ret = me.Replace(" ", " ");
|
||||||
// ReSharper disable once TailRecursiveCall
|
// ReSharper disable once TailRecursiveCall
|
||||||
return ret == me ? ret : TrimSpaces(ret);
|
return ret == me ? ret : ret.TrimSpaces();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// 将\ux0000 、 %u0000 、 � 编码转换成可读字符串
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="me"></param>
|
||||||
|
/// <returns></returns>
|
||||||
|
public static string UnicodeDe(this string me)
|
||||||
|
{
|
||||||
|
const string replacement = "&#x$1;";
|
||||||
|
if (me.Contains(@"\u")) {
|
||||||
|
return RegexBacksLantUnicode().Replace(me, replacement).HtmlDe();
|
||||||
|
}
|
||||||
|
|
||||||
|
return me.Contains(@"%u") ? RegexPercentUnicode().Replace(me, replacement).HtmlDe() : me.HtmlDe();
|
||||||
|
}
|
||||||
|
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// url编码
|
/// url编码
|
||||||
@ -585,4 +580,25 @@ public static class StringExtensions
|
|||||||
{
|
{
|
||||||
return Uri.UnescapeDataString(me);
|
return Uri.UnescapeDataString(me);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// MD5 hmac编码
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="me">字符串</param>
|
||||||
|
/// <param name="key">密钥</param>
|
||||||
|
/// <param name="e">字符串使用的编码</param>
|
||||||
|
/// <returns>hash摘要的16进制文本形式(无连字符小写)</returns>
|
||||||
|
private static string Md5Hmac(this string me, string key, Encoding e)
|
||||||
|
{
|
||||||
|
using var md5Hmac = new HMACMD5(e.GetBytes(key));
|
||||||
|
return BitConverter.ToString(md5Hmac.ComputeHash(e.GetBytes(me)))
|
||||||
|
.Replace("-", string.Empty)
|
||||||
|
.ToLower(CultureInfo.CurrentCulture);
|
||||||
|
}
|
||||||
|
|
||||||
|
[GeneratedRegex("\\\\u([a-fA-F0-9]{4})")]
|
||||||
|
private static partial Regex RegexBacksLantUnicode();
|
||||||
|
|
||||||
|
[GeneratedRegex("\\\\u([a-fA-F0-9]{4})")]
|
||||||
|
private static partial Regex RegexPercentUnicode();
|
||||||
}
|
}
|
@ -1,7 +1,7 @@
|
|||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFrameworks>net6.0;net7.0</TargetFrameworks>
|
<TargetFramework>net7.0</TargetFramework>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
Loading…
x
Reference in New Issue
Block a user