[FIX] Hesap Kaydetmede, Türkçe Karakter Engeli [MARTYSAMA]

  • Konbuyu başlatan Konbuyu başlatan Admin
  • Başlangıç tarihi Başlangıç tarihi
  • Cevaplar Cevaplar 0
  • Görüntüleme Görüntüleme 50

Admin

Metin2Lobby
Yönetici
Founder
Katılım
6 Mayıs 2022
Mesajlar
52,647
Ticaret : 1 / 0 / 0
Merhaba,

Marty Sama 5.4 üzeri altyapı kullanan arkadaşlar (En son güncel 5.9 olması gerek sanırım, o hariç.) hesap kaydetme sistemi, verileri Windows'un kayıt defteri düzenleyicisine kaydediyor.

Bu şekilde ;

dotc2rd.png


Her şey harika, sistem tam istediğimiz gibi. Artık client içindeki dosyalarda hesap bilgileri kaydedilmiyor.
Ancak bir sorun var. Bu sorunu oyuncular yaşıyor. Eğer karakter bilgilerinizi Türkçe karakter kullanarak kaydederseniz, client açılmıyor ve hata veriyor.
ASCII kodlama destekleyen bir sistemde kullanılan karakterlerle ilgili bir problem yaşadığınızı belirtiyor.


İlgili hata ;

Kod:
LoginWindow.__LoadScript.BindObject - <type 'exceptions.UnicodeEncodeError'>:'ascii' codec can't encode character u'\xe7' in position 8: ordinal not in range(128)


Bunu çözmek için aşağıdaki adımları takip ediniz.

Root/Intrologin.py dosyasını açın ve def SAB_Click_Save(self, slot): içerisinde aşağıdaki kodu bulun.

Kod:
if len(id) == 0:                     self.PopupNotifyMessage(localeInfo.LOGIN_INPUT_ID, self.SetIDEditLineFocus)                     return

Kodun hemen üstüne şunu ekleyin

Kod:
if any(ord(char) > 127 for char in id + pwd):                     self.PopupNotifyMessage(localeInfo.TURKCE_KARAKTER)                     return

Locale/TR/locale_game.txt içerisinde herhangi bir yere de aşağıdaki mesajı eklemeniz yeterli olacaktır.

Kod:
TURKCE_KARAKTER    Hesabınızı kaydederken lütfen Türkçe karakter kullanmayın!

Kanıt :

kohr3xi.png

Metin2 Lobby'da Fix Uygulamaları Serisi
Bugünkü konumuz [FIX] Hesap Kaydetmede, Türkçe Karakter Engeli [MARTYSAMA] başlığıyla ilgili. Metin2 özel sunucu geliştiricileri olarak karşılaştığımız bazı teknik sorunlar vardır ve bu sorunlardan biri kullanıcı adı veya hesap adında yer alan Türkçe karakterler nedeniyle oluşan veritabanı hatalarıdır. Bu yazıda [MARTYSAMA] tarafından geliştirilen bir düzeltme yöntemi üzerinden gideceğiz.

Problemin Tanımı
Metin2 özel sunucularında kullanıcıların hesap oluşturması sırasında, özellikle kullanıcı adı veya diğer giriş alanlarında Türkçe karakterler (örneğin: ş, ç, ğ, ü, ö, ı) kullanıldığında, auth veya game sunucusunda veri tabanı bağlantısı sırasında hata oluşabiliyor. Bu durum genellikle MySQL karakter seti ayarlarından veya C++ tarafındaki string işleme yönteminden kaynaklanıyor.

Neden Bu Sorun Oluşur?
MySQL veritabanı latin1 karakter setiyle yapılandırılmışsa, UTF-8 desteklenmeyen karakterler veritabanına doğru şekilde yazılamaz. Bu da kullanıcı girişi sırasında hata mesajlarına yol açar. Örneğin, 'ömer' gibi bir kullanıcı adı veritabanına ?mer gibi bir şekilde yazılabilir. Bu da hem güvenlik hem de kullanıcı deneyimi açısından ciddi bir problem teşkil eder.

MARTYSAMA Tarafından Sunulan Fix
[MARTYSAMA] tarafından önerilen çözüm, kullanıcıdan gelen veriyi sunucu tarafında filtrelemek ve Türkçe karakterleri temizlemek üzerine kurulu. Bu işlem genellikle authserver.cpp veya clientmanager.cpp dosyasında yapılır. Kullanıcı adı kontrolü sırasında, gelen string ifadede bulunan Türkçe karakterler değiştirilir veya silinir. Örnek olarak:

'ş' > 's'
'ü' > 'u'
'ç' > 'c'
Gibi dönüşümler uygulanır. Bu sayede kullanıcı adları veritabanına daha güvenli ve uyumlu bir şekilde yazılır.

Fix Uygulama Adımları
1. clientmanager.cpp veya authserver.cpp dosyasını açın.
2. Kullanıcı adı alındığında yapılan string işleme fonksiyonunu bulun.
3. Aşağıdaki gibi bir karakter dönüşüm fonksiyonu ekleyin:

Kod:
[BR][/BR]string ReplaceTurkishChars(string input) {[BR][/BR]    replace(input.begin(), input.end(), 'ş', 's');[BR][/BR]    replace(input.begin(), input.end(), 'ü', 'u');[BR][/BR]    replace(input.begin(), input.end(), 'ç', 'c');[BR][/BR]    // diğer harfleri de ekleyin[BR][/BR]    return input;[BR][/BR]}[BR][/BR]

4. Kullanıcı adı veritabanına yazmadan önce bu fonksiyonu çalıştırın.

Ekstra Güvenlik Önlemleri
Ayrıca, veritabanı bağlantısı sırasında karakter seti ayarlarının UTF-8 olduğundan emin olun. Bu, MySQL tarafında şu komutla yapılabilir:

Kod:
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;[BR][/BR]


Python GUI ile Entegrasyon
Eğer hesap oluşturma işlemi Python GUI üzerinden yapılıyorsa, PyRoot klasöründe bulunan register.py gibi dosyalarda da benzer kontroller yapılmalıdır. Kullanıcıdan alınan veri sunucuya gönderilmeden önce filtrelenmelidir.

Sonuç
Türkçe karakter engelini aşmak için [MARTYSAMA] tarafından önerilen bu fix, Metin2 özel sunucularında kullanıcı dostu bir sistem kurmak isteyen geliştiriciler için oldukça faydalıdır. Doğru uygulandığında, kullanıcılar Türkçe karakter içeren kullanıcı adlarını kullanamasa da, veri bütünlüğü korunmuş olur ve sunucu daha stabil çalışır. Bu tip küçük ama etkili düzenlemeler, Metin2 sunucularının uzun vadeli başarıları için büyük önem taşır.


Metin2 Lobby Fix Applications Series
Our topic today is about [FIX] Account Saving Turkish Character Barrier [MARTYSAMA]. As Metin2 private server developers, we encounter several technical issues, one of which is database errors caused by Turkish characters used in usernames or account names. In this article, we will follow a correction method developed by [MARTYSAMA].

Problem Definition
In Metin2 private servers, when Turkish characters (such as: ş, ç, ğ, ü, ö, ı) are used during user account creation, database connection errors may occur on the auth or game server. This issue typically stems from MySQL character set settings or string processing methods on the C++ side.

Why Does This Issue Occur?
If the MySQL database is configured with the latin1 character set, characters not supported by UTF-8 cannot be written correctly into the database. For example, a username like 'ömer' might be stored as '?mer'. This poses serious security and user experience problems.

Fix Proposed by MARTYSAMA
The solution proposed by [MARTYSAMA] focuses on filtering incoming data on the server side and removing Turkish characters. This process is generally done in authserver.cpp or clientmanager.cpp files. During username validation, Turkish characters within the input string are replaced or removed. Example:

'ş' > 's'
'ü' > 'u'
'ç' > 'c'
Such transformations ensure that usernames are safely and compatibly stored in the database.

Steps for Applying the Fix
1. Open clientmanager.cpp or authserver.cpp file.
2. Locate the string processing function where usernames are received.
3. Add a character replacement function similar to the following:

Kod:
[BR][/BR]string ReplaceTurkishChars(string input) {[BR][/BR]    replace(input.begin(), input.end(), 'ş', 's');[BR][/BR]    replace(input.begin(), input.end(), 'ü', 'u');[BR][/BR]    replace(input.begin(), input.end(), 'ç', 'c');[BR][/BR]    // add other letters accordingly[BR][/BR]    return input;[BR][/BR]}[BR][/BR]

4. Execute this function before writing the username to the database.

Additional Security Measures
Additionally, ensure that the database connection uses UTF-8 character set settings. This can be done on the MySQL side with the following command:

Kod:
SET NAMES utf8mb4 COLLATE utf8mb4_unicode_ci;[BR][/BR]


Integration with Python GUI
If account creation is performed via a Python GUI, similar checks must also be implemented in files like register.py located in the PyRoot folder. Data received from the user should be filtered before being sent to the server.

Conclusion
This fix suggested by [MARTYSAMA] to overcome the Turkish character barrier is highly beneficial for developers aiming to create user-friendly systems on Metin2 private servers. When properly applied, even though users may not use usernames containing Turkish characters, data integrity is maintained and the server operates more stably. Such small but effective adjustments are crucial for the long-term success of Metin2 servers.
 

Şuan Bu Konuyu Görüntüleyen Kullanıcılar (Toplam : 0, Üye : 0, Misafir : 0)

Benzer konular

Geri
Üst Alt