i18n.commitEncoding is EVIL
Dieses Issue hat noch niemand übernommen.
Bewertung
- Schwierigkeit
- 4/5
- Geschätzter Aufwand
- 3-5 Tage
- Anfängerfreundlichkeit
- 35/100
Rechercherichtung
Beginne bei NativeMethods.git_commit_message und Proxy.git_commit_message und untersuche anschließend, wie Commit.Encoding bereitgestellt wird und wie Utf8NoCleanupMarshaler das native Ergebnis verarbeitet. Vergleiche das Verhalten mit den drei Beispiel-Commits unter Verwendung der Encodings default, gb2312 und cp936; abgeschlossen ist die Aufgabe, wenn Commit-Nachrichten korrekt decodiert werden, sobald Git eine unterstützte Codepage-Kodierung angibt.
Vom Indexierungsmodell aus dem Issue-Text verfasst.
Beschreibung
Recently days I am researching i18n.commitEncoding, It's real an EVIL!!
First of all, I am a Chinese that OS language is en-us with Chinese(simplified) region. The commonly used encoding is GB2312(also GBK, code page 936).
The i18n.commitEncoding was defined in here that Character encoding the commit messages are stored in; git itself does not care per se, but this information is necessary.
OK, It's mean this config will affect the commit messages. but, I have find no any documents to define the format of encoding. I open the references window of Git GUI, and find the Default File Contents Encoding field. First item is System(cp936) of change menu, however, have an item Chinese Simplified (GB2312). They are equivalent in my first impression of two items.
I created a new repository then submit 3 commits with difference i18n.commitEncoding to test they. Both of they commit messages are four words Chinese, and i18n.commitEncoding followed by default, gb2312, cp936. (pushed to https://github.com/Aimeast/TestForFirst/commits/i18n)
git.execan display the second commitGit GUIcan display the first and third commitsGitHubcan display the first and second commits, third commit displayed as JapaneseLibGit2Sharpcan display the first and second commits (third commit not same with Github)
OK, the result real funny. I decompress objects files for digging.
- The first and second commits (e2266b and 38a2b0) were stored as
utf-8 - The third commit (bd9f62) was stored as
gb2312
After my analysis, git.exe can identify format start with cp and followed by code page number. So, we can explain why there is such result.
Now, let's into the issue. The code
// NativeMethods.git_commit_message
[DllImport(libgit2)]
[return : MarshalAs(UnmanagedType.CustomMarshaler, MarshalCookie = UniqueId.UniqueIdentifier, MarshalTypeRef = typeof(Utf8NoCleanupMarshaler))]
internal static extern string git_commit_message(GitObjectSafeHandle commit);
It's always marshal as Utf-8 result in third commit message was messy code. So, I suggest that return raw data then decode string in Proxy.git_commit_message. But, the evil is .Net Framework not support some encoding which supported by git.exe.
Hereafter is my code for detect the encoding for a commit
public static Encoding CpAsEncoding(this Commit commit)
{
try
{
var encoding = commit.Encoding;
if (encoding.StartsWith("cp", StringComparison.OrdinalIgnoreCase))
return Encoding.GetEncoding(int.Parse(encoding.Substring(2)));
return Encoding.GetEncoding(encoding);
}
catch
{
return Encoding.UTF8;
}
}
Not perfect codes, but It's working.
- Vorherrschende Sprache
- C#
- Sterne
- 3.5k
- Forks
- 925
- PR-Merge-Kennzahlen
- Keine gemergten PRs in 30 T.
Beitragsleitfaden
Erste Schritte
- Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
- Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
- Forken Sie das Repository und arbeiten Sie in einem Branch.
- Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.
Mehr aus libgit2/libgit2sharp
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 52/100
libgit2/libgit2sharp#2193 · 2 Kommentare ·
-
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 38/100
libgit2/libgit2sharp#2192 · 1 Kommentar ·
-
Website is down Offen
Schwierigkeit 4/5 3-5 Tage Anfängerfreundlichkeit 20/100
libgit2/libgit2sharp#2191 · 2 Reaktionen ·
-
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 68/100
libgit2/libgit2sharp#2189 · 1 Reaktion ·
-
Schwierigkeit 3/5 1-2 Tage Anfängerfreundlichkeit 35/100
libgit2/libgit2sharp#2187 · 2 Kommentare ·
Alle Issues in libgit2/libgit2sharp
Ähnliche Issues
-
bug
Schwierigkeit 1/5 Unter einer Stunde Anfängerfreundlichkeit 75/100
sillsdev/languageforge-lexbox#2665 ·
-
bug documentation frontend
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
azurenoops/spin_agent#975 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 86/100
-
:watch: Not Triaged 11.0 fundamentals/subsvc
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 92/100
dotnet/AspNetCore.Docs#37699 ·
-
Schwierigkeit 2/5 1-3 Stunden Anfängerfreundlichkeit 72/100
SubtitleEdit/subtitleedit#15108 · 1 Kommentar ·