diff --git a/README.md b/README.md index 6f54b74..722862d 100644 --- a/README.md +++ b/README.md @@ -49,8 +49,9 @@ mutable package state. `Kind` is `text`, `binary`, or `unknown`. `Format` and `MIME` describe the physical content. `Encoding` is set for accepted UTF-8, UTF-16LE, or UTF-16BE -text and never appears as a MIME charset parameter. Compare `Format` against -the exported `Format*` constants rather than string literals. +text and never appears as a MIME charset parameter. Compare `Format` and +`Encoding` against the exported `Format*` and `Encoding*` constants rather +than string literals. The format registry contains: diff --git a/example_test.go b/example_test.go index e0d1f84..50dfd47 100644 --- a/example_test.go +++ b/example_test.go @@ -21,3 +21,17 @@ func ExampleDetectPrefix() { // Output: // text need-more } + +func ExampleResult_Encoding() { + result := magic.Detect([]byte("\xff\xfeh\x00i\x00")) + + switch result.Encoding { + case magic.EncodingUTF16LE, magic.EncodingUTF16BE: + fmt.Println("decode UTF-16 before processing text") + case magic.EncodingUTF8: + fmt.Println("process text directly") + } + + // Output: + // decode UTF-16 before processing text +} diff --git a/json_test.go b/json_test.go index 2cda8cb..b834bd9 100644 --- a/json_test.go +++ b/json_test.go @@ -26,7 +26,7 @@ func TestJSONDetection(t *testing.T) { Kind: KindText, MIME: mimeJSON, Format: FormatJSON, - Encoding: encodingUTF8, + Encoding: EncodingUTF8, }) }) } @@ -70,7 +70,7 @@ func TestInvalidJSONRetainsExistingClassification(t *testing.T) { Kind: KindText, MIME: mimeText, Format: FormatText, - Encoding: encodingUTF8, + Encoding: EncodingUTF8, }) }) } @@ -165,7 +165,7 @@ func TestJSONPrefixDetection(t *testing.T) { Kind: KindText, MIME: mimeJSON, Format: FormatJSON, - Encoding: encodingUTF8, + Encoding: EncodingUTF8, Reason: ReasonNeedMore, }) }) @@ -199,7 +199,7 @@ func TestInvalidJSONPrefixRetainsExistingClassification(t *testing.T) { Kind: KindText, MIME: mimeText, Format: FormatText, - Encoding: encodingUTF8, + Encoding: EncodingUTF8, Reason: ReasonNeedMore, }) }) diff --git a/magic.go b/magic.go index cbed39a..8e289ac 100644 --- a/magic.go +++ b/magic.go @@ -89,10 +89,13 @@ const ( mimePE = "application/vnd.microsoft.portable-executable" mimeWASM = "application/wasm" mimeAR = "application/x-archive" +) - encodingUTF8 = "utf-8" - encodingUTF16LE = "utf-16le" - encodingUTF16BE = "utf-16be" +// Encoding values reported in Result.Encoding. +const ( + EncodingUTF8 = "utf-8" + EncodingUTF16LE = "utf-16le" + EncodingUTF16BE = "utf-16be" ) // Detect classifies data as the complete content of a file. diff --git a/magic_test.go b/magic_test.go index b828f03..1a03a42 100644 --- a/magic_test.go +++ b/magic_test.go @@ -25,7 +25,7 @@ func TestDetectPrefix(t *testing.T) { Kind: KindText, MIME: mimeText, Format: FormatText, - Encoding: encodingUTF8, + Encoding: EncodingUTF8, Reason: ReasonNeedMore, }, }, @@ -125,7 +125,7 @@ func TestDetectDoesNotRetainInput(t *testing.T) { Kind: KindText, MIME: mimeText, Format: FormatText, - Encoding: encodingUTF8, + Encoding: EncodingUTF8, }) } diff --git a/signatures_test.go b/signatures_test.go index ae8cf58..ab61600 100644 --- a/signatures_test.go +++ b/signatures_test.go @@ -221,7 +221,7 @@ func TestTextFormatRegistryAndPrecedence(t *testing.T) { t.Run(test.name, func(t *testing.T) { t.Parallel() got := Detect([]byte(test.input)) - if got.Kind != KindText || got.Encoding != encodingUTF8 || + if got.Kind != KindText || got.Encoding != EncodingUTF8 || got.Format != test.format || got.MIME != test.mime { t.Fatalf("Detect() = %#v, want text %s %s", got, test.format, test.mime) } diff --git a/text.go b/text.go index a9e18f0..53dce8f 100644 --- a/text.go +++ b/text.go @@ -34,7 +34,7 @@ func classifyText(data []byte) Result { if containsDisallowedControlUTF8(data) { return Result{Kind: KindBinary} } - return Result{Kind: KindText, Encoding: encodingUTF8} + return Result{Kind: KindText, Encoding: EncodingUTF8} } func classifyUTF8BOM(data []byte) Result { @@ -44,7 +44,7 @@ func classifyUTF8BOM(data []byte) Result { if containsDisallowedControlUTF8(data) { return Result{Kind: KindBinary} } - return Result{Kind: KindText, Encoding: encodingUTF8} + return Result{Kind: KindText, Encoding: EncodingUTF8} } func classifyUTF16BOM(data []byte, littleEndian bool) Result { @@ -56,9 +56,9 @@ func classifyUTF16BOM(data []byte, littleEndian bool) Result { return Result{Kind: KindBinary} } - encoding := encodingUTF16BE + encoding := EncodingUTF16BE if littleEndian { - encoding = encodingUTF16LE + encoding = EncodingUTF16LE } return Result{Kind: KindText, Encoding: encoding} } diff --git a/text_test.go b/text_test.go index bbb8a9d..71ec36f 100644 --- a/text_test.go +++ b/text_test.go @@ -26,7 +26,7 @@ func TestTextDecisionTable(t *testing.T) { Kind: KindText, MIME: mimeText, Format: FormatText, - Encoding: encodingUTF8, + Encoding: EncodingUTF8, }, }, { @@ -36,7 +36,7 @@ func TestTextDecisionTable(t *testing.T) { Kind: KindText, MIME: mimeText, Format: FormatText, - Encoding: encodingUTF16LE, + Encoding: EncodingUTF16LE, }, }, { @@ -46,7 +46,7 @@ func TestTextDecisionTable(t *testing.T) { Kind: KindText, MIME: mimeText, Format: FormatText, - Encoding: encodingUTF16BE, + Encoding: EncodingUTF16BE, }, }, { @@ -81,7 +81,7 @@ func TestTextDecisionTable(t *testing.T) { Kind: KindText, MIME: mimeText, Format: FormatText, - Encoding: encodingUTF8, + Encoding: EncodingUTF8, }, }, { @@ -119,7 +119,7 @@ func TestUTF16Validation(t *testing.T) { Kind: KindText, MIME: mimeText, Format: FormatText, - Encoding: encodingUTF16LE, + Encoding: EncodingUTF16LE, }, }, { @@ -129,7 +129,7 @@ func TestUTF16Validation(t *testing.T) { Kind: KindText, MIME: mimeText, Format: FormatText, - Encoding: encodingUTF16LE, + Encoding: EncodingUTF16LE, }, }, { @@ -186,7 +186,7 @@ func TestPlainText(t *testing.T) { Kind: KindText, MIME: mimeText, Format: FormatText, - Encoding: encodingUTF8, + Encoding: EncodingUTF8, }) }) }