LCD I2C showing random letters that i didn't tell it to write

so i'm trying to make a project with the LCD I2C to show to my arab family, so i'm trying to create arabic letters to display the name of the project. but i want to create my own letters because the only library i found created like 9 letters which is nothing compared to the full arabic alphabet. so i wanted to create my own,but when i created most of the letters of the alphabet and started writing different letters,but it was writing different letters than told it to,i checked the code like 10 times but still there was no mistake in the code,i'm dealing with an arduino uno board,i connected the SDA pin to A4,and the SCL to the A5 PIN and this is my code:

#include <LiquidCrystal_I2C.h>

LiquidCrystal_I2C lcd(0x27, 16,2);

byte m[] = {
  B00000,
  B00000,
  B00000,
  B00000,
  B11111,
  B00101,
  B00111,
  B00000,
};

byte sh[] = {
  B00100,
  B01010,
  B00000,
  B10101,
  B11111,
  B00000,
  B00000,
  B00000
};

byte r[] = {
  B00000,
  B00000,
  B00000,
  B00000,
  B00001,
  B00001,
  B00010,
  B11100,
};

byte wow[] = {
  B00000,
  B00000,
  B00111,
  B00101,
  B00111,
  B00001,
  B00010,
  B11100
};

byte eye[] = {
  B01110,
  B01000,
  B01110,
  B10000,
  B10000,
  B10000,
  B10001,
  B01110
};

byte space[] = {
  B00000,
  B00000,
  B00001,
  B00000,
  B00000,
  B00001,
  B00000,
  B00000
};

byte a[] = {
  B00010,
  B00010,
  B00010,
  B00010,
  B00010,
  B00010,
  B00010,
  B00010
};
byte l[] = {
  B00010,
  B00010,
  B00010,
  B00010,
  B11110,
  B00000,
  B00000,
  B00000
};
byte A[] = {
  B10000,
  B10000,
  B10000,
  B10000,
  B11111,
  B00000,
  B00000,
  B00000
};
byte h[] = {
  B01100,
  B10010,
  B01110,
  B00010,
  B00011,
  B00000,
  B00000,
  B00000
};
void setup ()
{
  lcd.init();
  lcd.backlight();
  lcd.clear();

  lcd.createChar(1, m);
  lcd.createChar(2, sh);
  lcd.createChar(3, r);
  lcd.createChar(4, wow);
  lcd.createChar(5, eye);
  lcd.createChar(6, space);
  lcd.createChar(7, a);
  lcd.createChar(8, l);
  lcd.createChar(9, A);
  lcd.createChar(10, h);

  lcd.setCursor(15,0);
  lcd.write(1);

  lcd.setCursor(14,0);
   lcd.write(2);

  lcd.setCursor(13,0);
  lcd.write(3);

  lcd.setCursor(12,0);
  lcd.write(4);

  lcd.setCursor(11,0);
  lcd.write(5);

  lcd.setCursor(10,0);
  lcd.write(6);

  lcd.setCursor(9,0);
  lcd.write(7);

  lcd.setCursor(8,0);
  lcd.write(8);

  lcd.setCursor(7,0);
   lcd.write(2);

   lcd.setCursor(6,0);
   lcd.write(9);

   lcd.setCursor(5,0);
   lcd.write(2);

  lcd.setCursor(4,0);
  lcd.write(10);
}

void loop ()
{
  
}

it just began to replace the "A" with the "m" and the "sh" with the "h" and it even started to combine them

You can only create and use 8 custom characters at a time and they are numbered 0 to 7

See LiquidCrystal - createChar() - Arduino Reference

is there ANY OTHER WAY to create more?

Not that I can think of but other users may know of a way to do it

You can change the definition of any of the 8 characters at any time in the sketch but if you have already printed say character 3 and change its definition ready to print a different version then the character already on screen will immediately change to the new definition

Could you consider using an OLED screen for which there may be an Arabic font ?

i don't have an oled screen

well is there any library or way than you know of that has arabic fonts?

This will not have Arabic font, but uses pre-defined characters and claims to form Arabic characters.

#include <LiquidCrystal.h>

// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

 byte l[]={
    B01111,
    B01111,
    B01111,
    B01111,
    B01111,
    B01111,
    B01111,
    B01111
};
byte l1[]={
    B01111,
    B01111,
    B01111,
    B01111,
    B01111,
    B01111,
    B01111,
    B01111
};
byte l2[]={
    B00111,
    B00111,
    B00111,
    B00111,
    B00111,
    B11111,
    B11111,
    B11111
};
byte l3[]={
    B00000,
    B00000,
    B00000,
    B00000,
    B00000,
    B11111,
    B11111,
    B11111
};
byte l4[]={
    B00011,
    B00011,
    B00011,
    B01100,
    B11000,
    B11111,
    B11111,
    B11111
};
byte l5[]={
    B11111,
    B11111,
    B11111,
    B00111,
    B00111,
    B11111,
    B11111,
    B11111
};


void setup() {
  
  
  lcd.createChar(0,l);
  lcd.createChar(1,l1);
  lcd.createChar(2,l2);
  lcd.createChar(3,l3);
  lcd.createChar(4,l4);
  lcd.createChar(5,l5);

   lcd.begin(16, 2);
  lcd.clear();
  
  lcd.setCursor(15,0);
  lcd.write(byte(0));
  lcd.setCursor(14,0);
  lcd.write(byte(1));
  lcd.setCursor(12,0);
  lcd.write(byte(1));
   lcd.setCursor(10,0);
  lcd.write(byte(1));
  lcd.setCursor(15,1);
  lcd.write(byte(0));
   lcd.setCursor(14,1);
  lcd.write(byte(2));
  lcd.setCursor(12,1);
  lcd.write(byte(2));
   lcd.setCursor(10,1);
  lcd.write(byte(5));
   lcd.setCursor(13,1);
  lcd.write(byte(3));
   lcd.setCursor(11,1);
  lcd.write(byte(3));
    lcd.setCursor(9,1);
  lcd.write(byte(4));
 
}
 
void loop() {
  // scroll 13 positions (string length) to the left
  // to move it offscreen left:
  for (int positionCounter = 0; positionCounter < 13; positionCounter++) {
    // scroll one position left:
    lcd.scrollDisplayLeft();
    // wait a bit:
    delay(1000);
  }

  // scroll 29 positions (string length + display length) to the right
  // to move it offscreen right:
  for (int positionCounter = 0; positionCounter < 29; positionCounter++) {
    // scroll one position right:
    lcd.scrollDisplayRight();
    // wait a bit:
    delay(1000);
  }

  // scroll 16 positions (display length + string length) to the left
  // to move it back to center:
  for (int positionCounter = 0; positionCounter < 16; positionCounter++) {
    // scroll one position left:
    lcd.scrollDisplayLeft();
    // wait a bit:
    delay(1000);
  }

  // delay at the end of the full loop:
  delay(1000);
}

Are you asking whether I know of a font for the LCD or for an OLED screen ?

Take a look at this فارسی نویس آردوینو - - Wokwi ESP32, STM32, Arduino Simulator

for an arabic font not an oled screen

the code you provided is for a normal LCD screen not a LCD I2C screen

I am confident that you will not find an LCD screen that uses an Arabic font because the fonts are built in to the screen hardware, but I am prepared to be proven wrong

OLED screens can use external fonts

i found a library called U8G2 i'm gonna try it

That is a well known library but it will not work with an LCD screen

this is the link to it,i'm pretty sure it said in the discription that it works with all types of LCDs:

// NORMAL LCD
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

void setup() {
    lcd.begin(16, 2);
}
void loop() {}

THIS LINE IS A DIVIDER BETWEEN THE PSEUDO CODE ABOVE AND THE PSEUDO CODE BELOW

// I2C LCD
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 16, 2);
void setup() {
  lcd.init();
}
void loop(){}

ohhhhhh you combined the 2 librarys

U8g2 does work with LCDs... but only the standard fonts with 8 custom characters.

ohhh ok

Nothing was combined.

i mean you used the LiquidCrystal library with the LiquidCrystal_I2C together

LiquidCrystal.h is for the "normal" LCD
LiquidCrystal_I2C.h is for the "I2C" LCD

The libraries are not used together.