From 49a7ca4d82fd3f2c3518cad49d682c3c55c4c807 Mon Sep 17 00:00:00 2001 From: jules Date: Mon, 25 Apr 2016 21:16:54 +0100 Subject: [PATCH] Improved the String::createStringFromData method to fall back to a Windows 1252 codepage if given non-UTF8 data, and used this in parsing VST and WAV strings --- .../codecs/juce_WavAudioFormat.cpp | 20 +-------------- .../format_types/juce_VSTPluginFormat.cpp | 4 +-- modules/juce_core/text/juce_String.cpp | 25 ++++++++++++++++--- modules/juce_core/text/juce_String.h | 2 ++ 4 files changed, 26 insertions(+), 25 deletions(-) diff --git a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp index 24d808c2f0..7200d454bc 100644 --- a/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp +++ b/modules/juce_audio_formats/codecs/juce_WavAudioFormat.cpp @@ -646,24 +646,6 @@ namespace WavFileHelpers return true; } - static String getStringFromWindows1252Codepage (const uint8* data, size_t num) - { - HeapBlock unicode (num + 1); - - for (size_t i = 0; i < num; ++i) - unicode[i] = CharacterFunctions::getUnicodeCharFromWindows1252Codepage (data[i]); - - unicode[num] = 0; - return CharPointer_UTF32 (unicode); - } - - static String getStringFromData (const MemoryBlock& mb) - { - return CharPointer_UTF8::isValidString ((const char*) mb.getData(), (int) mb.getSize()) - ? mb.toString() - : getStringFromWindows1252Codepage ((const uint8*) mb.getData(), mb.getSize()); - } - static void addToMetadata (StringPairArray& values, InputStream& input, int64 chunkEnd) { while (input.getPosition() < chunkEnd) @@ -682,7 +664,7 @@ namespace WavFileHelpers { MemoryBlock mb; input.readIntoMemoryBlock (mb, (ssize_t) infoLength); - values.set (types[i], getStringFromData (mb)); + values.set (types[i], String::createStringFromData ((const char*) mb.getData(), mb.getSize())); break; } } diff --git a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp index 72b9b95abd..fc899123de 100644 --- a/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp +++ b/modules/juce_audio_processors/format_types/juce_VSTPluginFormat.cpp @@ -1601,7 +1601,7 @@ private: jassert (index >= 0 && index < effect->numParams); char nm [256] = { 0 }; dispatch (opcode, index, 0, nm, 0); - return String (CharPointer_UTF8 (nm)).trim(); + return String::createStringFromData (nm, (int) sizeof (nm)).trim(); } String getCurrentProgramName() @@ -1613,7 +1613,7 @@ private: { char nm[256] = { 0 }; dispatch (effGetProgramName, 0, 0, nm, 0); - progName = String (CharPointer_UTF8 (nm)).trim(); + progName = String::createStringFromData (nm, (int) sizeof (nm)).trim(); } const int index = getCurrentProgram(); diff --git a/modules/juce_core/text/juce_String.cpp b/modules/juce_core/text/juce_String.cpp index a58fecb8db..13975ed50e 100644 --- a/modules/juce_core/text/juce_String.cpp +++ b/modules/juce_core/text/juce_String.cpp @@ -1973,7 +1973,18 @@ int String::getHexValue32() const noexcept { return CharacterFunctions::Hex int64 String::getHexValue64() const noexcept { return CharacterFunctions::HexParser::parse (text); } //============================================================================== -String String::createStringFromData (const void* const unknownData, const int size) +static String getStringFromWindows1252Codepage (const char* data, size_t num) +{ + HeapBlock unicode (num + 1); + + for (size_t i = 0; i < num; ++i) + unicode[i] = CharacterFunctions::getUnicodeCharFromWindows1252Codepage ((uint8) data[i]); + + unicode[num] = 0; + return CharPointer_UTF32 (unicode); +} + +String String::createStringFromData (const void* const unknownData, int size) { const uint8* const data = static_cast (unknownData); @@ -2007,13 +2018,19 @@ String String::createStringFromData (const void* const unknownData, const int si return builder.result; } - const uint8* start = data; + const char* start = (const char*) data; if (size >= 3 && CharPointer_UTF8::isByteOrderMark (data)) + { start += 3; + size -= 3; + } - return String (CharPointer_UTF8 ((const char*) start), - CharPointer_UTF8 ((const char*) (data + size))); + if (CharPointer_UTF8::isValidString (start, size)) + return String (CharPointer_UTF8 (start), + CharPointer_UTF8 (start + size)); + + return getStringFromWindows1252Codepage (start, (size_t) size); } //============================================================================== diff --git a/modules/juce_core/text/juce_String.h b/modules/juce_core/text/juce_String.h index d59b744ccf..4a10c24d70 100644 --- a/modules/juce_core/text/juce_String.h +++ b/modules/juce_core/text/juce_String.h @@ -1199,6 +1199,8 @@ public: */ size_t copyToUTF32 (CharPointer_UTF32::CharType* destBuffer, size_t maxBufferSizeBytes) const noexcept; + static String fromSingleByteData (const void* data, size_t numBytes); + //============================================================================== /** Increases the string's internally allocated storage.