Wie kann ich richtig behandeln & # xFFFF; in UTF-8 XML?

Ich habe einige Probleme, die  , ein gültiges UTF-16-Konstrukt und auch scheinbar gültig in einem Windows-filenamen, in XML für den Verbrauch in SQL server XML (2012).

Nehmen Sie das zum Beispiel:

 DECLARE @Xml xml; SET @Xml = N'<?xml version="1.0"?><FileName>풜〣&#xFFFF;&#xFFFF;</FileName>' -- Result: XML parsing: line 1, character 41, illegal xml character 

Dies ist jedoch legal Unicode (ein "Unicode Noncharacter" ' '): http://www.fileformat.info/info/unicode/char/ffff/index.htm

Also habe ich das versucht:

 DECLARE @Xml xml; SET @Xml = N'<?xml version="1.0" encoding="utf-16"?><FileName>풜〣&#xFFFF;&#xFFFF;</FileName>' -- Result: XML parsing: line 1, character 59, illegal xml character 

Also – wie soll ich diesen filenamen genau in XML darstellen? Ich kann nicht einfach die Charaktere entfernen, sie sind ja &#xFFFF; character, die von Get-ChildItem gemeldet werden, und ich muss einen Griff für diese file behalten.

Ich kann die XML-Parsing zu arbeiten, indem sie &#xFFFF; mit ï¿¿ das ist die UTF-8-Darstellung von \uFFFF nach diesem Link Ich versuche dann, dieses XML zu nehmen und es in eine nvarchar Spalte einzufügen, und ich brauche dies die richtige Darstellung des filenamens.

 DECLARE @Xml xml; SET @Xml = N'<?xml version="1.0"?><FileName>풜〣ï¿¿ï¿¿</FileName>' SELECT F.Item.value('.', 'nvarchar(2000)') FROM @Xml.nodes('//FileName') as F(Item) -- Returns 풜〣ï¿¿ï¿¿ (not correct) 

&#xFFFF; (dh dezimal 65535) ist kein rechtlicher Charakter, auch nach dem in der Frage enthaltenen Link heißt es: "Dies ist jedoch gesetzliches UTF-16". Dieser Link zeigt, dass er illegal, nicht-charakteristisch ist und in keiner Weise vertreten sein kann (nach ihren Testseiten).

Auch nach Unicode.org :

Nichtcharaktere
Diese Codes sind für prozessinterne Anwendungen gedacht.

FFFE <kein Charakter>
• kann verwendet werden, um die Byte-Reihenfolge im Gegensatz zu FEFF zu erkennen
→ FEFF = Nullbreiten-Unterbrechungsraum

FFFF <kein Charakter>

Und nach W3C ist die list der gültigen character :

# x9 | #xA | #xD | [# x20- # xD7FF] | [# xE000- # xFFFD] | [# x10000- # x10FFFF]
/ * irgendein Unicode-character, ausgenommen die Surrogat-Blöcke, FFFE und FFFF. * /


Um dies in XML (zumindest in Bezug auf den SQL server XML-datatyp) zu erhalten, müssen Sie zuerst alle Vorkommen von &#xFFFE; und &#xFFFF; mit einer benutzerdefinierten Escape-Sequenz, wie \uFFFE; und \uFFFF; resektiv Dann können Sie bei der Umwandlung in NVARCHAR einfach \uFFFE; replace \uFFFE; mit NCHAR(65534) und \uFFFF; mit NCHAR(65535) beziehungsweise.

ODER , können Sie Base64 Kodieren Sie die Werte (eher einfach auf der App-Code-Seite) und decodieren auf dem Ausweg. Wenn du auf die databaseseite zugreifen musst, kannst du deine eigenen SQLCLR-functionen zu Base64 Encode und Decode erstellen oder einfach nur die freie Version der SQL # -Bibliothek (die ich bin Autor von) mit Convert_ToBase64 und Convert_FromBase64 und kann wie folgt verwendet werden:

 DECLARE @Encoded NVARCHAR(200), @Decoded NVARCHAR(200); SET @Encoded = SQL#.Convert_ToBase64(CONVERT(VARBINARY(200), N'f' + NCHAR(65535) + N'g'), 'None'); SELECT CONVERT(XML, N'<test>' + @Encoded + N'</test>'); SET @Decoded = SQL#.Convert_FromBase64(@Encoded); SELECT @Encoded AS [Encoded], @Decoded AS [Decoded], DATALENGTH(@Decoded) AS [NumBytes], -- 6 bytes = 3 characters (most of the time) UNICODE(SUBSTRING(@Decoded, 2, 1)) AS [TaDa!] -- get value of middle character 

Kehrt zurück:

 <test>ZgD//2cA</test> 

und dann:

 Encoded Decoded NumBytes TaDa! ZgD//2cA fg 6 65535 

Es scheint, dass es nicht als Teil eines filenamens verwendet werden sollte (ich weiß das ist nicht dein Tun), oder vielleicht ist es wirklich ein gültiges character, das von Get-ChildItem falsch gelesen wird.

Ich muss einen Griff für diese file behalten.

Ist es möglich, die file umzubenennen, um die ungültigen character vor dem Importieren der Namen / Info in SQL server zu entfernen? Nur ein Gedanke.


Und nur FYI, du darfst die Codierung nicht über die XML-Deklaration ändern, zumindest nicht so leicht: SQL server 2008R2 und XML-Dokument erstellen

Der Satz von character, der in XML-Dokumenten erlaubt ist, wird durch die Produktion 2 der XML-Spezifikation definiert. Es schließt U + FFFF aus (das als Un-character von Unicode definiert ist und das zum timepunkt der Entwicklung von XML im Informationsaustausch mit Unicode nicht erlaubt war).

Das bedeutet, dass Sie U + FFFF nicht buchstäblich in einem XML-Dokument darstellen können oder eine XML-numerische characterreferenz verwenden. Sie können natürlich Ihren eigenen Escape-Mechanismus erfinden oder etwas wie URI-Escaping verwenden, um das character in Ihren data zu verschlüsseln; bevor du die data in Anwendungen einfügst, die U + FFFF erlauben, musst du natürlich deine Darstellung wiederentdecken.

Ich frage mich, warum Nicht-character in Windows-filenamen erlaubt sind.