1
0
Fork 0
mirror of https://github.com/juce-framework/JUCE.git synced 2026-01-10 23:44:24 +00:00

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

This commit is contained in:
jules 2016-04-25 21:16:54 +01:00
parent c1799c9f82
commit 49a7ca4d82
4 changed files with 26 additions and 25 deletions

View file

@ -646,24 +646,6 @@ namespace WavFileHelpers
return true;
}
static String getStringFromWindows1252Codepage (const uint8* data, size_t num)
{
HeapBlock<juce_wchar> 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;
}
}

View file

@ -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();

View file

@ -1973,7 +1973,18 @@ int String::getHexValue32() const noexcept { return CharacterFunctions::Hex
int64 String::getHexValue64() const noexcept { return CharacterFunctions::HexParser<int64>::parse (text); }
//==============================================================================
String String::createStringFromData (const void* const unknownData, const int size)
static String getStringFromWindows1252Codepage (const char* data, size_t num)
{
HeapBlock<juce_wchar> 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<const uint8*> (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);
}
//==============================================================================

View file

@ -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.