1
0
mirror of https://github.com/rclone/rclone.git synced 2025-12-14 15:23:18 +00:00

encoder: add ForceNFC and ForceNFD options

See https://github.com/rclone/rclone/issues/8088#issuecomment-3001795870
This commit is contained in:
nielash
2025-07-12 15:05:11 -04:00
parent bfdd5e2c22
commit 24835344eb
4 changed files with 101 additions and 24 deletions

View File

@@ -18,6 +18,8 @@ import (
"strconv"
"strings"
"unicode/utf8"
"golang.org/x/text/unicode/norm"
)
const (
@@ -61,6 +63,8 @@ const (
EncodeRightPeriod // Trailing .
EncodeRightCrLfHtVt // Trailing CR LF HT VT
EncodeInvalidUtf8 // Invalid UTF-8 bytes
EncodeInvalidNFC // Force NFC encoding
EncodeInvalidNFD // Force NFD encoding
EncodeDot // . and .. names
EncodeSquareBracket // []
EncodeSemicolon // ;
@@ -148,6 +152,8 @@ func init() {
alias("RightPeriod", EncodeRightPeriod)
alias("RightCrLfHtVt", EncodeRightCrLfHtVt)
alias("InvalidUtf8", EncodeInvalidUtf8)
alias("ForceNFC", EncodeInvalidNFC)
alias("ForceNFD", EncodeInvalidNFD)
alias("Dot", EncodeDot)
}
@@ -226,6 +232,13 @@ func (mask MultiEncoder) Encode(in string) string {
return ""
}
if mask.Has(EncodeInvalidNFD) {
in = norm.NFD.String(in)
}
if mask.Has(EncodeInvalidNFC) {
in = norm.NFC.String(in)
}
if mask.Has(EncodeDot) {
switch in {
case ".":
@@ -688,6 +701,15 @@ func (mask MultiEncoder) Decode(in string) string {
return in
}
/* // Can't losslessly decode NFC/NFD
if mask.Has(EncodeInvalidNFD) {
in = norm.NFC.String(in)
}
if mask.Has(EncodeInvalidNFC) {
in = norm.NFD.String(in)
}
*/
if mask.Has(EncodeDot) {
switch in {
case "":