Oto możliwe rozwiązanie, ale nie zostało przetestowane, więc miej to na uwadze!
Na podobny problem natknąłem się jakiś czas temu ze znakami specjalnymi w Oracle. Mamy nasz znak ustawiony na UTF-16. Miał dziwne rzeczy, takie jak umlauty i inne znaki ascii poza normalnym zakresem 32-127.
Jedną z rzeczy, które możesz spróbować, jest najpierw wykonanie kodowania HTML do wszystkiego poza tym zakresem, załadowanie tego do tabeli danych w c#, a następnie, gdy tabela danych jest wypełniana (lub po jej wypełnieniu ...), wykonaj dekodowanie html na tych polach.
Mamy funkcję kodowania html, która robi to za nas, na przykład:
FUNCTION HTML_Encode_Special_Characters
(p_string IN VARCHAR2,
p_do_encode IN VARCHAR2 DEFAULT 'Y')
RETURN VARCHAR2 IS
first_location number := REGEXP_INSTR(p_string, '([^' || CHR(1) || '-' || CHR(127) || '])');
v_string VARCHAR2(32000);
v_char VARCHAR2(1 char);
v_ascii_number number;
BEGIN
IF p_do_encode = 'Y' AND first_location > 0 THEN
v_string := p_string;
FOR i IN first_location .. length(v_string) LOOP
v_char := substr(v_string,i,1);
v_ascii_number := ascii(v_char);
IF v_ascii_number > 128 THEN
-- just replace all of them
v_string := REPLACE (v_string, v_char,'&#' || v_ascii_number || ';');
END IF;
END LOOP;
RETURN (v_string);
ELSE
RETURN p_string;
END IF;
END;
Powinno to załadować dane „ciągowe” do Twojej tabeli, a w każdym przypadku, gdy masz znaki specjalne, pojawią się one w stylu „½” lub coś w tym rodzaju.
Następnie po stronie C# możesz zrobić coś z dekodowaniem html:
using System.Web;
HttpUtility.HtmlDecode(mystring);
Znowu... niesprawdzony. Ale powinno być bardzo łatwe do wdrożenia i przetestowania i/lub nieznacznego dostrojenia, aby działało.
Alternatywnym rozwiązaniem byłoby również po prostu wykonanie poprawki danych w bazie danych, aby zmienić wszystkie te znaki specjalne na „zwykłe” reprezentacje (tj. myślnik na normalny myślnik). Możesz to zrobić za pomocą niektórych wyrażeń regularnych, używając funkcji CHR(), a także przeglądać nieparzyste dane za pomocą funkcji DUMP().