텍스트를 UCS-2로 취급하면 많은 문제가 발생할 것으로 예상되지 않습니다.
(AFAIK) BMP 위에 대소 문자 매핑이 없기 때문에 대/소문자 문자가 자체적으로 매핑되기 때문에 대/소문자 변환이 문제가되어서는 안됩니다.
다른 모든 문자를 공백으로 두는 것은 문제를 묻는 것입니다. 실제로 캐릭터의 가치를 고려하지 않고 이러한 종류의 변형을 수행하는 것은 항상 위험한 활동입니다. 문자열 잘림으로 합법적으로 발생하는 것을 볼 수 있습니다. 그러나 타의 추종을 불허하는 대리모가 결과에 나타나면이 자체는 거대한 문제가 아닙니다. 그러한 데이터를 수신하는 모든 시스템은 신경 쓰지 않는 대리모를 교체 문자로 교체 할 수 있습니다.
분명히 문자열 길이는 문자 수가 아닌 바이트/2가 될 것이지만, 유니 코드 코드 차트의 깊이를 배관하면 문자 수는별로 유용하지 않습니다. 예를 들어 문자, RTL 언어, 방향 제어 문자, 태그 및 여러 종류의 공백 문자 조합으로 인해 ASCII 범위를 벗어나면 고정 폭 디스플레이에서 좋은 결과를 얻지 못할 것입니다. 높은 코드 포인트는 귀하의 문제 중 가장 적은 것입니다.
단지 안전한 측면에 있기 위해, 설형 문자 텍스트를 고고학자의 이름과 다른 열에 저장해야합니다. : D
경험적 데이터로 업데이트하십시오!
사례 변환으로 어떤 현상이 발생했는지 확인하기 위해 테스트를 실행했습니다. 저는 라틴어 스크립트에서 대문자로 된 영문 단어 TEST를 두 번 입력 한 다음 Deseret 스크립트에서 문자열을 작성했습니다. .NET 및 SQL Server에서이 문자열에 소문자 변환을 적용했습니다.
.NET 버전에서는 두 스크립트의 모든 문자를 올바르게 소문자로 처리했습니다. SQL Server 버전은 라틴 문자를 소문자로하고 Deseret 문자는 변경하지 않았습니다. 이것은 UTF-16 절인 UCS-2 처리에 관한 기대치를 충족시킵니다.
using System;
using System.Data.SqlClient;
class Program
{
static void Main(string[] args)
{
string myDeseretText = "TEST\U00010413\U00010407\U0001041D\U00010413";
string dotNetLower = myDeseretText.ToLower();
string dbLower = LowercaseInDb(myDeseretText);
Console.WriteLine(" Original: {0}", DisplayUtf16CodeUnits(myDeseretText));
Console.WriteLine(".NET Lower: {0}", DisplayUtf16CodeUnits(dotNetLower));
Console.WriteLine(" DB Lower: {0}", DisplayUtf16CodeUnits(dbLower));
Console.ReadLine();
}
private static string LowercaseInDb(string value)
{
SqlConnectionStringBuilder connection = new SqlConnectionStringBuilder();
connection.DataSource = "(local)";
connection.IntegratedSecurity = true;
using (SqlConnection conn = new SqlConnection(connection.ToString()))
{
conn.Open();
string commandText = "SELECT LOWER(@myString) as LoweredString";
using (SqlCommand comm = new SqlCommand(commandText, conn))
{
comm.CommandType = System.Data.CommandType.Text;
comm.Parameters.Add("@myString", System.Data.SqlDbType.NVarChar, 100);
comm.Parameters["@myString"].Value = value;
using (SqlDataReader reader = comm.ExecuteReader())
{
reader.Read();
return (string)reader["LoweredString"];
}
}
}
}
private static string DisplayUtf16CodeUnits(string value)
{
System.Text.StringBuilder sb = new System.Text.StringBuilder();
foreach (char c in value)
sb.AppendFormat("{0:X4} ", (int)c);
return sb.ToString();
}
}
출력 :
Original: 0054 0045 0053 0054 D801 DC13 D801 DC07 D801 DC1D D801 DC13
.NET Lower: 0074 0065 0073 0074 D801 DC3B D801 DC2F D801 DC45 D801 DC3B
DB Lower: 0074 0065 0073 0074 D801 DC13 D801 DC07 D801 DC1D D801 DC13
경우 누군가가 저렛 글꼴이 설치되어 그냥에서, 여기 당신의 즐거움을위한 실제 문자열입니다
Original: TEST
.NET Lower: test
DB Lower: test
좋아, 그래서 읽기/쓰기 문자열로 대리자 쌍으로 해석 될 내용이 포함되어 있더라도 nvarchar 필드에 대한 전체 엔터티는 문제 또는 정보 손실을 발생시키지 않습니다. 자, C# 문자열을 char 컬럼에 작성하는 것은 어떻습니까? 나는 약간의 해석과 변환을 필요로하고 데이터 손실을 야기 할 것이라고 생각한다 ... – Triynko
싱글 바이트 컬럼은 검색과 정렬 규칙을 정의 할뿐만 아니라, 문자가 허용됩니다. 열의 Z 드 페이지에있는 값에 맵핑 된 유니 Z 드 Z 드점은 보존되고 나머지는 v 려집니다. –
폐기되었거나 특정 더미 또는 "비 문자"바이트로 대체 되었습니까? 1 바이트 코드 페이지가 비 문자에 대해 특정 바이트를 보유합니까? 대상 코드 공간에 정의되지 않은 유니 코드 문자가 물음표로 바뀌 었음을 보여주는 몇 가지 예를 보았지만 실제로는 문자가 표시되지 않는 방법을 보았을 것입니다. – Triynko